java - Java中枚举类的初始化

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

最佳答案

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/

相关文章:

java - Axis2 对象到 xml

存储在 Amazon S3 中的 Java 图片上传

swift - 无法分配给值 : 'self' is immutable

Java递归反转字符串

java - 在实践中使用本地类

c# - 为什么 switch for enum 接受隐式转换为 0 但不接受任何其他整数?

模板类型的 C++ Constexpr 成员

java - 为什么我们不能使用构造函数本身来初始化 servlet?

SwiftUI - 使用带有提供值的枚举的选择器并返回正确的标签()

python - 在 Python 枚举中使用自定义 new 时出现 ValueError