【问题标题】:Java - create enums with dot notationJava - 使用点符号创建枚举
【发布时间】:2017-10-11 10:39:59
【问题描述】:

我需要像 WEATHER.SUNNY 这样的带有点符号的枚举,因为它们使用通配符表示主题。我知道这是不可能的,因为枚举需要是有效的标识符。

here 有人建议覆盖 toString 方法,但我真的不明白这是什么意思。 但是,现在还可以吗?

【问题讨论】:

    标签: java identifier enumerators


    【解决方案1】:

    您绝对可以按照@Stefan 的建议去做,但这可能是一个很好的用例,可以将字段附加到您的枚举值:

    public enum Topic {
        SUNNY("WEATHER.SUNNY"), CLOUDY("WEATHER.CLOUD"), ...
    
        String notation;
    
        Topic(String notation) {
            this.notation = notation;
        }
    
        public String getNotation() { return notation; }
    }
    

    然后你可以调用Topic.SUNNY.getNotation()

    【讨论】:

    • 感谢这个方法,它工作正常。不过,我不确定如何将其应用于更复杂的结构。想象一下:WEATHER.SUMMER.SUNNY.DRYHUMIDITY
    • 那里有隐含的层次结构吗?每个对象都会有这些类别中的每一个吗?作为一个主题类的字段,它们应该是不同的枚举吗?你能存储一个 Set 吗? Sorta 取决于你的目标?
    • 对不起,我不精确。点确实意味着层次顺序,并将导致树结构。用字符串做这件事显然没有问题,但同样用枚举,我真的不知道如何实现更复杂的结构。
    • 因此您可以投入大量资金并编写 DSL(例如,dzone.com/articles/creating-internal-dsls-java),或者您可以只做一个构建器模式,您的 build() 方法对您选择的枚举进行一些验证在你的各个领域。如果您希望能够执行您在此处引用的操作 (WEATHER.SUMMER.SUNNY.DRYHUMIDITY),您可以嵌套内部枚举,但底层代码会很快变得混乱。
    【解决方案2】:

    定义具有大写名称的枚举没有问题。 它与 Java 命名约定不一致,但它可以工作。

    enum WEATHER {
        SUNNY, CLOUDY;
    }
    

    然后你会这样使用:

    WEATHER weather = WEATHER.SUNNY
    

    【讨论】:

      【解决方案3】:

      展示覆盖 toString 想法的示例代码:

      public class Test {
      
      enum Weather { Sunny, Cloudy;
      
          @Override
          public String toString() {
              return "WEATHER." + super.toString().toUpperCase();
          }
      
      };
      
      public static void main(String[] args) {
          System.out.println(Weather.Sunny);
      }
      }
      

      输出:WEATHER.SUNNY

      【讨论】:

        猜你喜欢
        • 2015-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多