在 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
实现中更好。我的问题是为什么以及如何发生?
最佳答案
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;
}
}
在另一个类(class)中:
public static void main(String[] args) {
final MyEnumClass myEnumClass = MyEnumClass.INSTANCE;
system.out.println(myEnumClass.getSomeString());
}
这将打印出“字符串的某个值。”。
这表明 enum
实例是在类加载时初始化的,即就像由 static
初始化程序初始化一样。
或者换句话说:
new MyClass() == new MyClass();
始终假
,而:
MyEnumClass.INSTANCE == MyEnumClass.INSTANCE;
始终true
。即 MyEnumClass.INSTANCE
是始终相同 MyEnumClass.INSTANCE
而一个新的 MyClass
每次调用 new MyClass()
时都会创建。
这让我们很好地回答了您的“更好”问题。
enum
是一个单例实例,具有各种漂亮的方法,用于将 String
enum
名称转换为对其表示的单例实例的引用。它还保证,如果您反序列化enum
,则不会像普通类那样出现两个单独的实例。
因此,作为一个健壮且线程安全的单例,enum
肯定比 class
更好。
但是我们不能拥有两个具有不同 someString
值的 INSTANCE
实例,因此 enum
是无用的因为 一个类
...
简而言之,enum
适合其擅长的用途,class
适合其擅长的用途。它们不是替代品,因此不能以任何有意义的方式进行比较,除非将其中一个用作另一个。
关于java - Java中枚举类的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19971982/