当我遇到enum
时,我无法理解Enum<Type>
。通常,我们将枚举用作单独的类或作为类成员。
a)将枚举声明为单独的类或类成员的原因和好处是什么?谁能解释一下?
b)何时会延长Enum<Type>
而不是使用enum
?扩展Enum<Type>
有什么好处。
我碰巧碰到了valueOf()
enum
Enum<Type>
{{1}}和{{1}}方法,但这非常通用。
我经历了question,但这并没有解释枚举的力量,至少我找不到我想要的信息。
如果有人可以指出我在草根层面解释枚举的示例或文档,那就太棒了。
编辑:让问题更加清晰。将主题更改为更相关。
答案 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不支持多重继承,因此枚举不能扩展其他任何内容。