【问题标题】:Singleton enum with constants带常量的单例枚举
【发布时间】:2017-07-17 10:32:47
【问题描述】:

我正在尝试用很少的常量创建枚举。我希望枚举是单例的。使用下面的代码,我在 eclipse 中遇到编译错误:

语法错误,插入“)”

在第 5 行完成方法声明。我无法找出问题所在。

public enum Days {

      SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;

      INSTANCE; // line 5

      public Days getInstance() {
        return INSTANCE;
     }
}

【问题讨论】:

    标签: java enums singleton


    【解决方案1】:

    在枚举声明中,; 用在最后一个枚举值之后。

    所以这里:

    SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;  
    INSTANCE;
    

    这应该被删除:

    INSTANCE;
    

    我希望枚举是单例

    情况已经如此,但枚举值 (SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY) 每个都是单例。

    枚举类本身不是单例,也不是设计成单例。

    而不是尝试以这种方式访问​​枚举类:

    public Days getInstance() {
      return INSTANCE;
    }
    

    只使用类:Days

    【讨论】:

    • 让我在这里确认一下我的理解,1. 你的意思是说枚举默认是单例的,而实例变量返回对单例实例的引用。 2. 将为每个常量创建一个单例实例,例如一个用于 SUNDAY,一个用于 MONDAY,依此类推...... .
    • 第二点可以,但第一点不行。枚举类只是类。此类提供的单个单例由您声明的枚举值(SUNDAY、MONDAY 等)表示。
    • 如果枚举默认不是单例的,那么如何使其成为单例。请告知,因为我还不清楚。
    • 没那么复杂:每个枚举值都是一个单例。不是枚举类本身。 因此,当您声明 public enum Days { SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;} 您会获得 7 个 Days 实例,其中 每个都是单例
    • 知道了,先生。谢谢。
    【解决方案2】:

    删除INSTANCE 行,并像这样静态访问您的枚举:Days.MONDAY

    枚举并不意味着被实例化,这意味着尝试使您的枚举成为单例是没有意义的。

    【讨论】:

      【解决方案3】:

      您的两个要求不兼容。枚举值是enum 类的实例,您需要七个这样的值。根据定义,单例类是具有单个实例的类:

      单例:确保一个类只有一个实例,并提供一个全局访问点。 -- Design Pattern Book - Singleton

      所以从技术上讲,不可能有一个具有多个值的枚举类型也是单例。

      对于大多数使用场景,您可以简单地使用基本的枚举类型定义:

      public enum Days 
      { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }
      

      将单例设计模式和枚举类型结合起来的唯一情况是希望使用enum 声明来强制执行单例模式。有关详细信息,请参阅this post。请注意,在这种情况下,枚举中只有一个值,而这个值就是INSTANCE

      【讨论】:

        【解决方案4】:

        您不能破坏 ENUM 变量的声明,然后再继续。 在第 3 行用逗号添加 INSTANCE,就可以编译程序了。

        星期日、星期一、星期二、星期三、星期四、星期五、星期六、实例;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-21
          • 2011-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多