コンストラクタを使用して静的メンバーを初期化できるときに、なぜ静的初期化ブロックを使用する必要がありますか?Javaで静的初期化ブロックを使用するのはなぜですか?
答えて
まず、クラスのインスタンスが1つもないことがあります。または、静的メンバーをに設定してから、の前にクラスのインスタンスを作成することもできます。
は第二に、コンストラクタから静的メンバを初期化することは、より多くの仕事です:
- あなたはすべてのコンストラクタがこれを行うことを確認する必要があります。
- 静的メンバーが初期化されているかどうかを追跡するフラグを維持する必要があります。
- 競合状態を防ぐために同期について考える必要があります。
- 同期のパフォーマンスへの影響を考慮する必要があります。特に、多くのスレッドでクラスのインスタンスが多数作成されている場合は、
最後に、それは通常、概念的(遅延初期化のための合法的な用途があるので、私は「普通」と言う)を行うには間違ったことです。
+1 - 遅延(または非遅延遅延)初期化を実装しようとしていたとしても、おそらくコンストラクタで「起こさせる」ことはできません。 –
スタティックメンバは、クラスのインスタンスには関連付けられていませんが、コンストラクタはインスタンスを作成します。クラスのインスタンスを1つも持たずに静的メンバーを使用することができます。まだ初期化する必要があります。この場合、コンストラクタはジョブを実行できません。
なぜ:
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");
}};
- それは、jarファイル内のファイルを新しい匿名クラスを紹介。それほど最適ではありません。
- 2番目の形式は奇妙な遊びです。
なぜ新しい匿名クラスを導入するのが最適ではないのですか?バグをクラスロードすることになりますか?または単にあなたがあなたの瓶を膨らませたくないと言っていますか? @DavidT。 –
どちらの形式も嫌いではありませんが、最初のものは 'digits'の冗長な出現を持ち、2番目のものは任意のクラス(小さなオーバーヘッド)を作成し、Java以外の開発者にとって誤解を招く構文を持っています。実際の危険は、シリアライズ可能なクラスに対して非静的な '{{...}}'を使用するときです:周囲のクラスgetの 'this'もシリアライズされます。私はこのような 'X.this'がオブジェクトの再読み込み後にnullになったことに遭遇しました。 –
実際には、私は1つの違いを見つけました - > Eclipse上で、あなたが匿名のクラス内でクラッシュした場合、Eclipseはクラッシュのラインを指すプロジェクトも知りません(スレッドとランナブル匿名クラスとして) –
- 1. Java静的初期化ブロック
- 2. Mockitoで静的初期化ブロックを使用する
- 3. Javaの静的初期化ブロックから戻す方法
- 4. 静的イニシャライザがJavaで静的変数の再初期化を許可するのはなぜですか?
- 5. Javaの静的初期化ブロックからの切断
- 6. 初期化関数で静的クラスメンバーを初期化する
- 7. Javaでの静的初期化と動的初期化の違いは何ですか?
- 8. 春の静的初期化Springの静的初期化
- 9. 静的変数の初期化java
- 10. なぜこの静的ポインタへの初期化は無効ですか?
- 11. 静的初期化、
- 12. 静的初期化
- 13. 初期化ブロックのアノテーション静的かどうか
- 14. Java静的初期化子とリフレクション
- 15. Java外部クラス静的初期化
- 16. Javaインスタンスの初期化ブロックで例外をスローすることができないのはなぜですか?
- 17. Javaで静的クラスを再初期化する方法はありますか?
- 18. 静的初期化時にフリーの "char const *"を使用する
- 19. プライベート静的メソッドを使用して静的変数を初期化する
- 20. 静的メンバーを使用して静的マップを初期化する
- 21. JSONファイルを使用して静的クラスを初期化する
- 22. 静的変数をリテラルでない値で初期化できないのはなぜですか?
- 23. Goでの静的初期化?
- 24. 非最終静的フィールドの静的初期化は安全ですか?
- 25. 静的なboost :: unordered_mapの初期化
- 26. ExecutorServiceのスレッドセーフな静的初期化
- 27. 静的な初期化スレッドロックのLambdas
- 28. 静的初期化子は、静的なユーティリティクラスのメソッドをテストするJUnitテスト
- 29. 奇妙な静的初期化はC#でコンパイルされます
- 30. java:クラス初期化中に同じクラスの静的フィールドの初期化
あなたはそのクラスのインスタンスを持っていませんが、スタティックイニシャライザブロックで初期化された値を使用する静的関数を使用したい場合はどうなりますか? – ppeterka
とc'torが呼び出されるたびに、静的な値がリセットされます。悪い!! – Azodious