3

以前は、列挙型を使用する代わりに、次のようなことをしていました:

public static ExampleClass instance;

public ExampleClass(){
    instance=this;
}

public static ExampleClass getInstance(){
    return instance;
}

次に、誰かが enum シングルトンについて教えてくれました。

 public enum Example{
 INSTANCE;

 public static Example getInstance(){
      return Example.INSTANCE;
 }

最初の例では、インスタンスを作成するためにオブジェクトをインスタンス化する必要がありました。列挙型では、それを行う必要はありません..少なくとも表示されます。誰かがこの背後にある理由を説明できますか?

4

3 に答える 3

6

Java コンパイラは、enum フィールドを Java クラスの静的インスタンスとしてバイトコードで作成します。ここにバイトコードを含む素晴らしいブログ投稿 (私のブログではありません): http://boyns.blogspot.com/2008/03/java-15-explained-enum.html

于 2013-08-25T04:39:48.040 に答える
4

コンパイル後に列挙型/クラスを逆アセンブルすると、

javap の例

あなたは-

Compiled from "Example.java"
public final class Example extends java.lang.Enum<Example> {
    public static final Example INSTANCE;
    public static Example[] values();
    public static Example valueOf(java.lang.String);
    public static Example getInstance();
    static {};
}

ご覧のとおり、 INSTANCEExampleクラスの public static final フィールドです。

EmployeeClass を逆アセンブルすると、次のようになります。

public class ExampleClass {
    public static ExampleClass instance;
    public ExampleClass();
    public static ExampleClass getInstance();
}

違いがわかりますか?細かい違いはあるものの基本的には同じです。

于 2013-08-25T04:41:47.680 に答える