枚举单例如何运作?

时间:2013-08-25 04:26:38

标签: java enums singleton instance

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

public static ExampleClass instance;

public ExampleClass(){
    instance=this;
}

public static ExampleClass getInstance(){
    return instance;
}

然后有人告诉我一个enum singleton:

 public enum Example{
 INSTANCE;

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

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

3 个答案:

答案 0 :(得分:6)

Java编译器负责将字节字段创建为字节码中Java类的静态实例。关于字节码的精彩博客文章(不是我的博客):http://boyns.blogspot.com/2008/03/java-15-explained-enum.html

答案 1 :(得分:5)

如果在使用 -

编译后反汇编枚举/类
  

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 {};
}

如您所见 INSTANCE 示例类的公共静态最终字段。

如果你反汇编你的EmployeeClass,你得到 -

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

你现在看到差异了吗?它与微小的差异基本相同。

答案 2 :(得分:1)

我建议阅读Joshua Bloch撰写的Item 3: Enforce the singleton property with a private constructor or an enum type from Effective Java,其中解释了它的工作原理以及为什么将枚举用作单身人士。