枚举单例如何运作?

Jac*_*cob 3 java singleton enums instance

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

public static ExampleClass instance;

public ExampleClass(){
    instance=this;
}

public static ExampleClass getInstance(){
    return instance;
}
Run Code Online (Sandbox Code Playgroud)

然后有人告诉我一个enum单身人士:

 public enum Example{
 INSTANCE;

 public static Example getInstance(){
      return Example.INSTANCE;
 }
Run Code Online (Sandbox Code Playgroud)

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

lre*_*der 6

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


Saj*_*tta 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 {};
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class ExampleClass {
    public static ExampleClass instance;
    public ExampleClass();
    public static ExampleClass getInstance();
}
Run Code Online (Sandbox Code Playgroud)

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