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实现中更好.我的问题是为什么以及如何发生?
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初始化器初始化.
或者换一种说法,如果你不覆盖equals在MyClass随后
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对于他们有益的东西也是有益的.它们不是替代品,因此当一个用作另一个时,不能以任何有意义的方式进行比较.