使用'enums'和'Enum <type>'</type>的原因

时间:2013-06-19 10:32:44

标签: java enums

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

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

b)何时会延长Enum<Type>而不是使用enum?扩展Enum<Type>有什么好处。

我碰巧碰到了valueOf() enum Enum<Type> {{1}}和{{1}}方法,但这非常通用。

我经历了question,但这并没有解释枚举的力量,至少我找不到我想要的信息。

如果有人可以指出我在草根层面解释枚举的示例或文档,那就太棒了。

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

3 个答案:

答案 0 :(得分:2)

如果我们知道如何使用枚举以及何时使用枚举

,那么

枚举非常强大

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

enum如何帮助: 所有字符串的crate枚举和比较字符串比较emum的instread。因为枚举比较基于它们的哈希值,这是一个数字,所以它比字符串比较快。

Oracle documentation所示,他们在星期日,星期一使用enum而不是String。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

enum不是原始类型。

来自Oracle Docs:

  

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

此外,the enum tutorials在基本层面上很好地解释了枚举。粘贴下面的提取物:

  

Java编程语言枚举类型比它强大得多       他们的同行用其他语言。枚举声明定义       一个类(称为枚举类型)。枚举类主体可以包括       方法和其他领域。编译器自动添加一些       创建枚举时的特殊方法。例如,他们有一个       static values方法,返回包含所有的数组       枚举的值按声明的顺序排列。这个方法是       通常与for-each构造结合使用以进行迭代       超过枚举类型的值。例如,这个代码来自       下面的行星类例子迭代了所有的行星       太阳系。

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

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