【问题标题】:Reasons for using 'enums' and 'Enum<Type>' [closed]使用“枚举”和“枚举<Type>”的原因 [关闭]
【发布时间】:2013-06-19 10:32:44
【问题描述】:

当我遇到Enum&lt;Type&gt; 时,我无法理解enum。通常,我们将枚举用作单独的类或作为类成员。

a) 将枚举声明为单独的类或类成员的原因和好处是什么?谁能解释一下?

b) 什么时候可以扩展 Enum&lt;Type&gt; 而不是使用 enum ?扩展Enum&lt;Type&gt; 有什么好处。

我碰巧碰到了question,它在enumenumEnum&lt;Type&gt; 中寻址valueOf() 方法,但这是非常通用的。

我浏览了Oracle documentation,但这并不能解释枚举的力量,至少我没有找到我正在寻找的信息。

如果有人可以向我指出一个解释基层枚举的示例或文档,那就太好了。

编辑:使问题更清晰。将主题更改为更相关。

【问题讨论】:

  • 您链接到的文档可以说是解释基层枚举的文档。您觉得缺少哪些关于“枚举的力量”的信息?
  • 1.回应你的标题:没有。 2.回答你的问题:难以理解。
  • 我让问题更清晰易懂。给您带来的不便深表歉意。

标签: java enums


【解决方案1】:

enum 不是原语——它是一个用于声明枚举的关键字,如果你愿意的话,它是一种语法糖。

您将始终使用enum 关键字定义枚举,而不是自己扩展Enum&lt;T&gt; 抽象类,因为这样做没有任何好处。使用enum 定义的枚举由编译器编译成扩展Enum 的类,这也确保自动生成适当的方法实现。

所以Enum 类之所以存在是因为它必须这样做,但总的来说,它只是使枚举工作的内部机制,您或多或少可以忽略它。将枚举视为枚举是完全合理的,而忽略编译器将生成的确切字节码。

【讨论】:

    【解决方案2】:

    如果我们知道如何使用枚举以及何时使用枚举,那么枚举是非常强大的

    案例 1: 当你有字符串常量值并且你正在比较它们时。

    枚举如何帮助: 所有字符串的 Crate 枚举和比较字符串比较 emum 的插入。由于枚举是根据它们的哈希值进行比较,这是一个数字,所以它比字符串比较快。

    Oracle documentation 所示,他们使用星期日、星期一作为枚举而不是字符串。

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

    案例 2:当您必须使用常量并且您必须比较常量时,因为其他常量的值是基于结果的。 例如。您有月份名称,根据月份名称,您可以获得有多少天,在这种情况下,枚举类型对您有很大帮助。

    例如。

    enum MonthEnum {
        JAN("Jan", 31, "Sunday"), Feb("Feb", 28, "Tuesday"), March("March", 28, "Monday");
    
        private final String monthName;
        private final int noOfDays;
        private final String startDay;
    
        private MonthEnum(final String monthName, final int noOfDays, final String startDay) {
            this.monthName = monthName;
            this.noOfDays = noOfDays;
            this.startDay = startDay;
        }
    
        public String getMonthName() {
            return monthName;
        }
    
        public int getNoOfDays() {
            return noOfDays;
        }
    
        public String getStartDay() {
            return startDay;
        }
    }
    

    您可以通过仅传递月份名称轻松获取枚举

    public static MonthEnum getMonthEnum(final String monthName) {
            MonthEnum month = null;
            for(MonthEnum monthEnum : MonthEnum.values()) {
                if(monthEnum.getMonthName().equalsIgnoreCase(monthName)) {
                    month = monthEnum;
                }
            }
            return month;
        }
    

    【讨论】:

      【解决方案3】:

      enum 不是原始类型。

      来自 Oracle 文档:

      枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。

      此外,the enum tutorials 在基础层面很好地解释了枚举。粘贴下面的摘录:

      Java 编程语言枚举类型比 他们在其他语言中的对应物。枚举声明定义 一个类(称为枚举类型)。枚举类主体可以包括 方法等领域。编译器会自动添加一些 创建枚举时的特殊方法。例如,他们有一个 静态值方法,返回一个包含所有 枚举的值按声明的顺序排列。这种方法是 通常与 for-each 构造结合使用以进行迭代 枚举类型的值。例如,这段代码来自 下面的 Planet 类示例遍历了 太阳系。

      for (Planet p : Planet.values()) {
          System.out.printf("Your weight on %s is %f%n",
                            p, p.surfaceWeight(mass)); }
      

      注意:所有枚举都隐式扩展 java.lang.Enum。由于 Java 不支持多重继承,因此枚举不能扩展任何其他内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多