18

インスタンス変数のない非静的メソッドを持つユーティリティクラスがあります。だから私はすべてのメソッドをstaticメソッドに変換することを考えています。メモリやパフォーマンスに影響があるとは思えません。しかし、私はただ確認したかっただけです。

そのような方法を変更staticして、プログラムのパフォーマンスに影響を与えるでしょうか?

4

7 に答える 7

23

人々がここで言ったことに追加する最後の1つ。

メソッドを使用するstaticと、コンパイル時のバインディングが保証されているため、オーバーヘッドがわずかに少なくなります。静的メソッド呼び出しは、バイトコード命令を作成しますinvokestatic。]

invokevirtual一般的なシナリオでは、インスタンスメソッドは実行時にバインドされ、。よりもオーバーヘッドが大きいバイトコード命令を作成しますinvokestatic

ただし、これはおそらく数百万回の反復の場合にのみ関係するので、これがクラス設計を推進することに注意します。設計の観点から意味のあることを行います。あなたの説明に基づいて、staticメソッドはおそらく行く方法です。実際、これはユーティリティクラスを作成するための比較的標準的な方法です。

public class MyUtilities {
   private MyUtilities() { } // don't let anyone construct it.
   public static String foo(String s) { ... }
}
于 2012-11-08T13:44:22.990 に答える
18

編集:パフォーマンスの側面に対処する:無意味に何かのインスタンスを作成する必要がない方が安価ですが、違いは完全に無関係である可能性が非常に高いです。明確なデザインに焦点を当てることは、時間の経過とともに重要になる可能性がはるかに高くなります。

ユーティリティメソッドは静的であることが多く、クラス内のすべてのメソッドが静的である場合は、クラスを作成し、インスタンス化を防ぐためfinalにプライベートコンストラクタを含める価値があります。基本的に、実際の「もの」を表さないユーティリティクラスでは、インスタンスを構築することは論理的に意味がありません。したがって、それを防止してください。

一方、これは柔軟性を低下させます:これらのユーティリティメソッドのいずれかに多形的に変更したい機能が含まれている場合(テスト目的など)、それらをインスタンスメソッドとして残すことを検討してください-そして、意味のあるクラス名を抽出して、関係する「もの」。(たとえば、aFooConverterはインスタンス化するのが理にかなっていますが、aはそうでFooUtilはありません。)

于 2012-11-08T12:12:27.890 に答える
3

ユーティリティクラスがサブクラス化されていない場合は、インスタンス変数にアクセスしないメソッドをに変換することをstaticお勧めします。コードを調べて、呼び出しを静的構文に変換する必要があります。

int res = utilityInstance.someMethod(arg1, arg2);

に変換する必要があります

int res = UtilityClass.someMethod(arg1, arg2);

明確にするために。

パフォーマンスへの顕著な影響はありません。理論的には静的な呼び出しの方がわずかに安価ですが、ほとんどのシナリオで重要と見なすには差が小さすぎます。

于 2012-11-08T12:10:49.217 に答える
3

メソッドを次のように変換する資格を得るには、2つの要件を満たす必要がありますstatic

  1. アクセスされたインスタンス変数はありません(これはあなたの場合に満たされます);
  2. オーバーライドの対象となる必要はありません(このため、考え抜かなければならない場合があります)。

ただし、これらの要件が満たされている場合は、メソッドが実行されるコンテキストを絞り込むため、実際にはメソッドを静的にすることをお勧めします。

最後に、ここで説明するパフォーマンスの問題はなく、動的メソッドの解決を伴わないため、理論上の違いは実際には静的メソッドに有利であることに注意してください。ただし、インスタンスメソッドの呼び出しは、関連するJVM実装で非常に高速です。

メモリに関しては、話は同じです。理論的な違いは静的メソッドを支持しますが、シングルトンユーティリティクラスと比較した場合、実際的な違いはありません。

于 2012-11-08T12:11:53.877 に答える
1

状態のないユーティリティクラス(java.lang.Mathたとえば)には、パブリック静的メソッドがあるのが一般的です。このように、それを使用するためにクラスのインスタンスを作成する必要はありません。

于 2012-11-08T12:10:39.153 に答える
0

特定の機能を頻繁に使用する場合は、静的メソッドをお勧めします。

于 2012-11-08T12:12:46.617 に答える
-2

違いは、それらを使用するにはインスタンスが必要であるため、ユーザーはインスタンスを作成する必要があることです。

于 2012-11-08T12:11:09.653 に答える