枚举单例如何运作?

以前不是使用枚举,我会做类似的事情:

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

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

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

如果在编译之后反汇编枚举/类,

javap示例

你得到-

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

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

如果你拆卸你的EmployeeClass,你得到 –

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

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

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