在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
实施中效果更好。我的问题是为什么以及如何发生?
答案 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?
可能还有更多需要学习的内容