3

以前我不使用枚举,而是执行以下操作:

public static ExampleClass instance;

public ExampleClass(){
    instance=this;
}

public static ExampleClass getInstance(){
    return instance;
}

然后有人告诉我一个枚举单例:

 public enum Example{
 INSTANCE;

 public static Example getInstance(){
      return Example.INSTANCE;
 }

在第一个示例中,我必须实例化对象才能创建实例。使用枚举,我不需要这样做.. 至少它出现了。有人可以解释这背后的原因吗?

4

3 回答 3

6

Java 编译器负责将枚举字段创建为字节码中 Java 类的静态实例。很棒的博客文章(不是我的博客),这里有字节码:http: //boyns.blogspot.com/2008/03/java-15-explained-enum.html

于 2013-08-25T04:39:48.040 回答
4

如果您在编译后反汇编枚举/类 -

javap 示例

你得到-

Compiled from "Example.java"
public final class Example extends java.lang.Enum<Example> {
    public static final Example INSTANCE;
    public static Example[] values();
    public static Example valueOf(java.lang.String);
    public static Example getInstance();
    static {};
}

如您所见,INSTANCEExample类的公共静态最终字段。

如果你反汇编你的 EmployeeClass,你会得到——

public class ExampleClass {
    public static ExampleClass instance;
    public ExampleClass();
    public static ExampleClass getInstance();
}

您现在看到差异了吗?本质上是一样的,只是有细微的差别。

于 2013-08-25T04:41:47.680 回答
1

我建议阅读Item 3: Enforce the singleton property with a private constructor or an enum type from Effective JavaJoshua Bloch 的文章,它解释了它是如何工作的以及为什么将枚举用作单例。

于 2013-08-25T04:57:05.973 回答