-3

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

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

b)什么时候可以扩展Enum<Type>而不是使用enum?扩展有什么好处Enum<Type>

我碰巧遇到了解决方法的问题,但这是非常通用的。valueOf()enumEnum<Type>

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

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

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

4

3 回答 3

2

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

情况 1:当您有字符串常量值并且您正在比较它们时。

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

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

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

并且您可以通过仅传递 monthName 轻松获取枚举

public static MonthEnum getMonthEnum(final String monthName) {
        MonthEnum month = null;
        for(MonthEnum monthEnum : MonthEnum.values()) {
            if(monthEnum.getMonthName().equalsIgnoreCase(monthName)) {
                month = monthEnum;
            }
        }
        return month;
    }
于 2013-06-19T10:50:26.057 回答
2

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

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

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

于 2013-06-19T11:00:26.130 回答
1

enum不是原始类型。

来自 Oracle 文档:

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

此外,枚举教程在基本级别上很好地解释了枚举。粘贴下面的摘录:

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 不支持多重继承,因此枚举不能扩展其他任何东西。

于 2013-06-19T10:41:52.937 回答