28

これは、非常に広く普及している列挙シングルトン コードです。

public enum enumClazz{
   INSTANCE
   enumClazz(){
     //do something
   }
}

そして、それは怠惰な初期化であると多くの場所が言いました。しかし、「 Java 仮想マシンの内部」の第 7 章を​​読んだ後、私は混乱しています-- タイプの寿命:

Java 仮想マシンの仕様は、クラスとインターフェースのロードとリンクのタイミングで実装に柔軟性を与えますが、初期化のタイミングを厳密に定義します。すべての実装は、最初のアクティブな使用時に各クラスまたはインターフェイスを初期化する必要があります。次の 6 つの状況は、積極的な使用に該当します。

  • クラスの新しいインスタンスが作成されます (バイトコードでは、新しい命令の実行。または、暗黙的な作成、リフレクション、クローン作成、または逆シリアル化を介して)。
  • クラスによって宣言された静的メソッドの呼び出し (バイトコードでは、invokestatic 命令の実行)
  • クラスまたはインターフェイスによって宣言された static フィールドの使用または割り当て。
  • クラス Class 内のメソッドや java.lang.reflect パッケージ内のクラス内のメソッドなど、Java API 内の特定のリフレクション メソッドの呼び出し。
  • クラスのサブクラスの初期化 (クラスの初期化には、そのスーパークラスの事前の初期化が必要です。)
  • Java 仮想マシンの起動時に (main()< メソッドを使用して) 初期クラスとしてクラスを指定する

太字の 3 番目のポイントは、フィールドが の場合、static finalコンパイル時にフィールドの初期化が行われることを明確にしています。同様に、INSTANCEinenumClazzは暗黙のうちに 3 番目の点と等しくpublic static final、準拠しています。

私の理解が間違っている場合、誰かが私を修正できますか?

4

2 に答える 2