4

クラスの一番上でオブジェクトを宣言するプログラムがたくさんあります。このオブジェクトは、それ自体のクラス内からのみ変更され、このクラスの複数のインスタンスが同時に実行されることはありません。オブジェクトを として宣言する利点はありますstaticか?

public class MyClass {

    private Map<String, Object> myMap; // any reason to make this static?

    // constructor and other code here
}
4

3 に答える 3

1

変数を静的として宣言すると、変数がクラスのすべてのオブジェクト間で共有されます (この例では MyClass )。クラスのオブジェクトを作成せずに変数を返す静的メソッドを作成できるもう 1 つのことです。

MyClass.method();

場合によっては、これは MyClass のオブジェクトを作成してメソッドを呼び出すよりも理にかなっている場合があります。これは、Math クラスのように、片側の問題です。MyClass のインスタンスを 1 つだけ持ちたい場合は、クラスのインスタンスのみを保証するシングルトン デザイン パターンをチェックしてください。

于 2013-07-27T00:00:33.167 に答える
1

メンバーを静的にする 1 つの理由は、定数です。public static final Sting SOME_CONSTANT = "amazing";インスタンスよりも静的にアクセスする方が簡単です。

静的メンバーを使用しない理由は、テスト (静的メンバーを簡単にモックする方法) または (特にマップを使用して) スレッドの安全性をテストするためです。

于 2013-07-27T00:25:06.423 に答える
0

オブジェクトを静的として宣言する利点はありますか?

そうではありません。

確かに、パフォーマンス上の利点はありません。これは、静的が実際にはヒープ内に存在する (非表示の) 静的フレーム オブジェクトに格納されるためです。最終的に、JIT は、静的変数をフェッチするためのネイティブ コードを生成しますが、これはオブジェクト変数のフェッチよりも高速ではありません。


static を使用して、アプリケーション内で「グローバルに」データ構造を共有する方が便利であると主張することができます。しかし、その便利さにはいくつかの重大な欠点があります。最大の問題は、静的によってテストが難しくなり、コードの再利用が難しくなることです。


ただし、一般的なケースと、 static が不変の値またはデータ構造を保持または参照する特定のケースとを混同しないでください。たとえば、文字列定数または定数マッピングのように。これらは、設計と実際の両方の理由で正当化できます。例えば

  public static final String THE_ANSWER = "Forty two";

  private static final Map<String, Integer> SCORES;
  static {
      Map<String, Integer> map = new HashMap<>();
      tmp.put("perfect", 100);
      tmp.put("average", 50);
      tmp.put("fail", 20);
      SCORE = Collections.unmodifiableMap(map);
  }

これは問題ありません...異なる(現在または将来の)ユースケースが異なる値/マッピング/その他を必要とする可能性がない限り。その可能性がある場合、static有害である可能性があります。

于 2013-07-27T00:01:23.243 に答える