9

Javaでシングルトーンパターンを実装するためのさまざまなスタイルに関する多くのフォーラムや投稿を読みましたが、「列挙型はJavaでシングルトーンパターンを実装するための最良の方法です」と思われます。Java Enumを使用して、遅延読み込み機能を備えたJavaでSingleToneパターンを実装するにはどうすればよいでしょうか。列挙型は単なるクラスであるため。クラスが初めて使用されるとき、クラスはJVMによってロードされ、すべての静的初期化が実行されます。列挙型メンバーは静的であるため、すべて初期化されます。

遅延読み込みをサポートする列挙型を使用する方法を知っている人はいますか?

4

2 に答える 2

9

あなたが読んだ情報源が怠惰なシングルトンを行う最も簡単な方法であると言った理由は、それがうまくいくはずだからです。これを試して:

public class LazyEnumTest {
  public static void main(String[] args) throws InterruptedException {
    System.out.println("Sleeping for 5 seconds...");
    Thread.sleep(5000);
    System.out.println("Accessing enum...");
    LazySingleton lazy = LazySingleton.INSTANCE;
    System.out.println("Done.");
  }
}

enum LazySingleton {
  INSTANCE;
  static { System.out.println("Static Initializer"); }
}

コンソールに表示される出力は次のとおりです。

$ java LazyEnumTest
Sleeping for 5 seconds...
Accessing enum...
Static Initializer
Done.
于 2013-03-18T05:59:22.617 に答える
8

クラスが初めて使用されると、JVM によってロードされ、すべての静的初期化が行われます。enum メンバーは static なので、すべて初期化されます。

実際には、classloader は、最初にこのクラスにアクセスした後にのみクラスをロードします (変に聞こえます)。enum-singletonクラスにアクセスする唯一の理由は、そのインスタンスを取得することです。

そのため、Java の単一要素列挙型シングルトーンはレイジーと呼ばれます。その値は、最初にアクセスする前に初期化されません。

同様の質問:

于 2013-03-18T05:56:12.970 に答える