1

Java では、次のようにしてクラスを初期化し、そのクラス内でメソッドを呼び出すことができます。

public class MyClass {
  public String myClassMethod() {
    return "MyClass";
  }
}

.

public class Test {
  public static void main(String[] args) {
    MyClass myClass = new MyClass(); // initialize MyClass
    myClass.myClassMethod();// call a method      
  }
}

私のクラスがクラスの場合enum、実装は次のようになります。

public enum MyEnumClass {
  INSTANCE;
  public String myEnumClassMethod() {
    return "MyEnumClass";
  }
}

.

public class Test {
  public static void main(String[] args) {
    MyEnumClass myEnumClass = MyEnumClass.INSTANCE;
    myEnumClass.myEnumClassMethod();
  }
}

enumどちらの場合も同じように機能しますが、実装では優れていると言われています。私の質問は、なぜ、どのようにそれが起こっているのですか?

4

2 に答える 2

8

Anenumは基本的にシングルトン パターンです。

JVM は、enumインスタンスの初期化と保存を処理します。これを最も明確に見るために、次のように書くことができます:

public enum MyEnumClass {
    INSTANCE("some value for the string.");

    private final String someString;

    private MyEnumClass(final String someString) {
        this.someString = someString;
    }

    public String getSomeString(){
        return someString;
    }
}

そして別のクラスで:

public static void main(String[] args) {
    final MyEnumClass myEnumClass = MyEnumClass.INSTANCE;
    system.out.println(myEnumClass.getSomeString());
}

これにより、「文字列の値」が出力されます。

これは、enumインスタンスがクラスのロード時に初期化されることを示しています。つまり、staticイニシャライザによるかのようです。

または別の言い方をすると:

new MyClass() == new MyClass();

常にfalseですが、次のようになります。

MyEnumClass.INSTANCE == MyEnumClass.INSTANCE;

いつもtrueです。つまり、呼び出しのたびに新しいものが作成されるのに対し、常に同じMyEnumClass.INSTANCEです。 MyEnumClass.INSTANCEMyClassnew MyClass()

これは、「より良い」というあなたの質問に私たちをうまく導きます.

Anは、名前をそれが表すシングルトン インスタンスへの参照にenum変換するためのさまざまな気の利いたメソッドを備えたシングルトン インスタンスです。String enumまた、を逆シリアル化した場合enum、通常のクラスの場合のように 2 つの別個のインスタンスが存在しないことも保証されます。

したがって、enum堅牢でスレッドセーフなシングルトンとして、 は確かに よりもはるかに優れていclassます。

INSTANCEしかし、 の値が異なるの 2 つのインスタンスを持つことはできないsomeStringため、enumは...としては役に立ちません。class

要するにenum、 s は彼らが得意とするところに適しており、classes は彼らが得意とするところに適しています。それらは代替物ではないため、一方が他方として使用される場合を除いて、意味のある方法で比較することはできません。

于 2013-11-14T07:38:50.343 に答える
1

これは、Singleton パターンの単純な実装であり、Enum の動作メカニズムに依存しています。

2 回目に使用MyEnumClass.INSTANCEすると、同じオブジェクト インスタンスが取得されます。

対照的にnew MyClass();、新しいオブジェクトを作成します。

ここでの議論も参照してください。

JavaでEnumをシングルトンとして使用するための最良のアプローチは何ですか?

Java 言語仕様のセクション 8-9を読むことで、さらに多くのことを学ぶことができます。

于 2013-11-14T07:38:26.800 に答える