Java中的枚举类初始化

时间:2013-11-14 07:30:22

标签: java enums initialization

在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实施中效果更好。我的问题是为什么以及如何发生?

2 个答案:

答案 0 :(得分:6)

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;
    }
}

在另一堂课中:

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

这会打印出“字符串的某些值。”。

这表明enum个实例是在类加载时初始化的,即好像是static初始值。

或换句话说,如果你没有覆盖equals中的MyClass,那么

new MyClass() == new MyClass();

总是false ,而:

MyEnumClass.INSTANCE == MyEnumClass.INSTANCE;

始终true 。即MyEnumClass.INSTANCE 始终相同 MyEnumClass.INSTANCE,而每次通话MyClass时都会创建新的new MyClass() 。< / p>

这很好地解释了你对“更好”的问题。

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

因此enum作为一个健壮的线程安全单例肯定比class更好。

但我们不能让INSTANCE的两个实例具有someString的不同值,因此enum无效 a class .. 。

简而言之enum s对他们有益的事情有好处,class es对他们有益的事情有好处。它们不是替代品,因此当一个用作另一个时,它们无法以任何有意义的方式进行比较。

答案 1 :(得分:0)

这是Singleton模式的一个简单实现,依赖于Enum工作的机制。

如果您再次使用MyEnumClass.INSTANCE,您将获得相同的对象实例。

相反,new MyClass();将创建一个新对象。

另见这里的讨论:

What is the best approach for using an Enum as a singleton in Java?

阅读Java Language Spec Section 8-9

可能还有更多需要学习的内容