【问题标题】:What is the proper way to implement enum to manage constants in Java?实现枚举以管理 Java 中的常量的正确方法是什么?
【发布时间】:2013-01-09 17:25:58
【问题描述】:

在做了一些研究之后,我发现从 java 1.5 开始,最好在枚举中管理在“常量”类中声明的常量(或关键属性)。

我想知道实现这些枚举的正确方法是什么,以尽可能简单地获取枚举元素的值,无论其类型如何。

示例:是否可以在 Messages 为“Constant.Messages.WARNING”的位置:

public enum Messages {

    WARNING("main.message.warning")

}

谢谢。

【问题讨论】:

标签: java enums


【解决方案1】:

除了少数例外,您可以将枚举自定义为 Java 中的其他类。

我将使用相同的示例,但它使用toString 而不使用getMessage,因此您可以在调用toString 的地方使用枚举(例如,在System.out.println 或任何日志记录方法中)。

public enum Messages
{
    WARNING("main.message.warning"),
    ERROR("main.message.error");

    private final String message;

    // Parameters to the enum constructors are the ones in the enum "definition"
    Messages(final string message)
    {
        this.message = message;
    }

    @Override
    public String toString()
    {
        return message;
    }
}

【讨论】:

  • 谢谢。所有答案都相似,但谢谢大家。
【解决方案2】:

您可以通过实现一些方法来做到这一点。您将需要一个构造函数和一个 getter:

public enum Messages {
    WARNING("main.message.warning");

    private String message;

    Messages (String message) { this.message = message; }

    public String get() { return this.message; }
}

现在你可以写了:

String msg = Messages.WARNING.get();

【讨论】:

    【解决方案3】:
    public enum Messages {
    
        WARNING("main.message.warning")
        private String message;
        Messages(String message) {
            this.message = message
        }
        String getMessage() {
            return this.message;
        }
    }
    

    毕竟你可以

    Messages.WARNING.getMessage()
    

    【讨论】:

      【解决方案4】:

      是的,但在这种情况下,"main.message.warning" 是枚举的实例成员:

      public enum Messages
      {
          WARNING("main.message.warning"),
          ERROR("main.message.error");
      
          private final String message;
      
          // Parameters to the enum constructors are the ones in the enum "definition"
          Messages(final string message)
          {
              this.message = message;
          }
      
          public String getMessage()
          {
              return message;
          }
      }
      

      还要注意,所有这些构造函数都是在 JVM 启动时调用的;当您的程序“准备就绪”时,枚举值都在那里。

      【讨论】:

        【解决方案5】:

        Java 编译器在幕后做了一些魔术,所以enums 遇到它们时会觉得有点奇怪。您可以使用私有构造函数添加任意附加数据,例如:

        public enum Messages {
        
            WARNING("main.message.warning");
        
            private final String key;
        
            private Messages(String key) { this.key = key; }
            public String getKey() { return key; }
        }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 2020-10-27
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        相关资源
        最近更新 更多