Java中的枚举类初始化

Ruc*_*era 2 java enums initialization

在Java中,我们可以执行以下操作来初始化该类中的类和调用方法:

public class MyClass {
  public String myClassMethod() {
    return "MyClass";
  }
}
Run Code Online (Sandbox Code Playgroud)

.

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

如果我的类是一个enum类,则实现如下:

public enum MyEnumClass {
  INSTANCE;
  public String myEnumClassMethod() {
    return "MyEnumClass";
  }
}
Run Code Online (Sandbox Code Playgroud)

.

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

这两种情况都以相同的方式工作,但据说它在enum实现中更好.我的问题是为什么以及如何发生?

Bor*_*der 6

An enum本质上是单例模式.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

而在另一堂课:

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

这将打印出"字符串的某些值".

这表明enum实例在类加载时初始化,即好像由static初始化器初始化.

或者换一种说法,如果你不覆盖equalsMyClass随后

new MyClass() == new MyClass();
Run Code Online (Sandbox Code Playgroud)

永远false的,而:

MyEnumClass.INSTANCE == MyEnumClass.INSTANCE;
Run Code Online (Sandbox Code Playgroud)

始终true.即MyEnumClass.INSTANCE始终不变的 MyEnumClass.INSTANCE,而MyClass创建的每个时间您的来电new MyClass().

这使我们很好地回答了你的"更好"的问题.

An enum是一个单例实例,具有各种漂亮的方法,用于将String enum名称转换为对其所代表的单例实例的引用.它还保证如果你反序列化,enum就不会有像普通类那样的两个独立实例.

因此,enum作为一个强大且线程安全的单例,它肯定要好得多class.

但是,我们不能有两个实例INSTANCE与不同的值someString,因此enum是无用class...

简而言之enum,对于他们有益的东西是好的,而且class对于他们有益的东西也是有益的.它们不是替代品,因此当一个用作另一个时,不能以任何有意义的方式进行比较.

  • 不,枚举可以用作单身模式,但这是副作用.Enum只是一个枚举. (2认同)
  • @SilviuBurcea `enum` 可以用作单例模式,因为它是单例,因此它实现了单例模式。您可以将其他一些单例值挂在“enum”之外,但这既不存在也不存在。 (2认同)