6

コンストラクターを介して静的メンバーを初期化できるのに、なぜ静的初期化ブロックを使用する必要があるのですか?

4

3 に答える 3

5

まず、クラスのインスタンスがない可能性があります。または、クラスのインスタンスを作成する前に、静的メンバーを初期化することもできます。

第二に、コンストラクターから静的メンバーを初期化することは、より多くの作業です。

  • すべてのコンストラクターがこれを実行することを確認する必要があります。
  • 静的メンバーが初期化されているかどうかを追跡するためにフラグを維持する必要があります。
  • 競合状態を防ぐために同期について考える必要があります。
  • 特に、クラスの多くのインスタンスを作成するスレッドが多数ある場合は、同期のパフォーマンスへの影響を考慮する必要があります。

最後に、概念的に行うことは通常間違っています(怠惰な初期化には正当な使用法があるため、「通常」と言います)。

于 2013-03-06T11:44:23.143 に答える
1

コンストラクターがインスタンスを作成している間、静的メンバーはクラスのどのインスタンスにも関連付けられません。クラスのインスタンスを1つも持たずに静的メンバーを使用できますが、それでも初期化する必要があります。この場合、コンストラクターはその仕事をすることができません。

于 2013-03-06T11:44:29.897 に答える
0

なぜ:

static Set<String> digits = new HashSet<String>();
static {
    Collections.add(digits, "unu", "du", "tri", "kvar", "kvin");
    digits.add("ses");
    digits.add("sep");
    digits.add("ok");
}

次のことが可能な場合:

static Set<String> digits = new HashSet<String>() {{
    Collections.add(this, "unu", "du", "tri", "kvar", "kvin");
    add("ses");
    add("sep");
    add("ok");
}};
  1. 新しい匿名クラス、jar内のファイルを導入します。それほど最適ではありません。
  2. 2番目の形式はオタクな遊びものです。
于 2013-03-06T11:46:37.320 に答える