これは、非常に広く普及している列挙シングルトン コードです。
public enum enumClazz{
INSTANCE
enumClazz(){
//do something
}
}
そして、それは怠惰な初期化であると多くの場所が言いました。しかし、「 Java 仮想マシンの内部」の第 7 章を読んだ後、私は混乱しています-- タイプの寿命:
Java 仮想マシンの仕様は、クラスとインターフェースのロードとリンクのタイミングで実装に柔軟性を与えますが、初期化のタイミングを厳密に定義します。すべての実装は、最初のアクティブな使用時に各クラスまたはインターフェイスを初期化する必要があります。次の 6 つの状況は、積極的な使用に該当します。
- クラスの新しいインスタンスが作成されます (バイトコードでは、新しい命令の実行。または、暗黙的な作成、リフレクション、クローン作成、または逆シリアル化を介して)。
- クラスによって宣言された静的メソッドの呼び出し (バイトコードでは、invokestatic 命令の実行)
- クラスまたはインターフェイスによって宣言された static フィールドの使用または割り当て。
- クラス Class 内のメソッドや java.lang.reflect パッケージ内のクラス内のメソッドなど、Java API 内の特定のリフレクション メソッドの呼び出し。
- クラスのサブクラスの初期化 (クラスの初期化には、そのスーパークラスの事前の初期化が必要です。)
- Java 仮想マシンの起動時に (main()< メソッドを使用して) 初期クラスとしてクラスを指定する
太字の 3 番目のポイントは、フィールドが の場合、static final
コンパイル時にフィールドの初期化が行われることを明確にしています。同様に、INSTANCE
inenumClazz
は暗黙のうちに 3 番目の点と等しくpublic static final
、準拠しています。
私の理解が間違っている場合、誰かが私を修正できますか?