【问题标题】:How does an enum singleton function?枚举单例如何工作?
【发布时间】:2013-08-25 12:57:05
【问题描述】:

以前我不使用枚举,而是这样做:

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 enums singleton instance


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      您现在看到差异了吗?基本相同,只是略有不同。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-25
          • 1970-01-01
          相关资源
          最近更新 更多