インスタンス変数のない非静的メソッドを持つユーティリティクラスがあります。だから私はすべてのメソッドをstatic
メソッドに変換することを考えています。メモリやパフォーマンスに影響があるとは思えません。しかし、私はただ確認したかっただけです。
そのような方法を変更static
して、プログラムのパフォーマンスに影響を与えるでしょうか?
インスタンス変数のない非静的メソッドを持つユーティリティクラスがあります。だから私はすべてのメソッドをstatic
メソッドに変換することを考えています。メモリやパフォーマンスに影響があるとは思えません。しかし、私はただ確認したかっただけです。
そのような方法を変更static
して、プログラムのパフォーマンスに影響を与えるでしょうか?
人々がここで言ったことに追加する最後の1つ。
メソッドを使用するstatic
と、コンパイル時のバインディングが保証されているため、オーバーヘッドがわずかに少なくなります。静的メソッド呼び出しは、バイトコード命令を作成しますinvokestatic
。]
invokevirtual
一般的なシナリオでは、インスタンスメソッドは実行時にバインドされ、。よりもオーバーヘッドが大きいバイトコード命令を作成しますinvokestatic
。
ただし、これはおそらく数百万回の反復の場合にのみ関係するので、これがクラス設計を推進することに注意します。設計の観点から意味のあることを行います。あなたの説明に基づいて、static
メソッドはおそらく行く方法です。実際、これはユーティリティクラスを作成するための比較的標準的な方法です。
public class MyUtilities {
private MyUtilities() { } // don't let anyone construct it.
public static String foo(String s) { ... }
}
編集:パフォーマンスの側面に対処する:無意味に何かのインスタンスを作成する必要がない方が安価ですが、違いは完全に無関係である可能性が非常に高いです。明確なデザインに焦点を当てることは、時間の経過とともに重要になる可能性がはるかに高くなります。
ユーティリティメソッドは静的であることが多く、クラス内のすべてのメソッドが静的である場合は、クラスを作成し、インスタンス化を防ぐためfinal
にプライベートコンストラクタを含める価値があります。基本的に、実際の「もの」を表さないユーティリティクラスでは、インスタンスを構築することは論理的に意味がありません。したがって、それを防止してください。
一方、これは柔軟性を低下させます:これらのユーティリティメソッドのいずれかに多形的に変更したい機能が含まれている場合(テスト目的など)、それらをインスタンスメソッドとして残すことを検討してください-そして、意味のあるクラス名を抽出して、関係する「もの」。(たとえば、aFooConverter
はインスタンス化するのが理にかなっていますが、aはそうでFooUtil
はありません。)
ユーティリティクラスがサブクラス化されていない場合は、インスタンス変数にアクセスしないメソッドをに変換することをstatic
お勧めします。コードを調べて、呼び出しを静的構文に変換する必要があります。
int res = utilityInstance.someMethod(arg1, arg2);
に変換する必要があります
int res = UtilityClass.someMethod(arg1, arg2);
明確にするために。
パフォーマンスへの顕著な影響はありません。理論的には静的な呼び出しの方がわずかに安価ですが、ほとんどのシナリオで重要と見なすには差が小さすぎます。
メソッドを次のように変換する資格を得るには、2つの要件を満たす必要がありますstatic
。
ただし、これらの要件が満たされている場合は、メソッドが実行されるコンテキストを絞り込むため、実際にはメソッドを静的にすることをお勧めします。
最後に、ここで説明するパフォーマンスの問題はなく、動的メソッドの解決を伴わないため、理論上の違いは実際には静的メソッドに有利であることに注意してください。ただし、インスタンスメソッドの呼び出しは、関連するJVM実装で非常に高速です。
メモリに関しては、話は同じです。理論的な違いは静的メソッドを支持しますが、シングルトンユーティリティクラスと比較した場合、実際的な違いはありません。
状態のないユーティリティクラス(java.lang.Math
たとえば)には、パブリック静的メソッドがあるのが一般的です。このように、それを使用するためにクラスのインスタンスを作成する必要はありません。
特定の機能を頻繁に使用する場合は、静的メソッドをお勧めします。
違いは、それらを使用するにはインスタンスが必要であるため、ユーザーはインスタンスを作成する必要があることです。