在 Java 中打开 Enum

为什么不能在 Java 中打开枚举?这看起来非常简单,并且可以编写一些方便的代码。这个问题也适用于 String。你可以打开 char,但不能打开 String... ?

468374 次浏览

你当然可以打开枚举。

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


public class EnumTest {
Day day;


public EnumTest(Day day) {
this.day = day;
}


public void tellItLikeItIs() {


switch (day) {
case MONDAY:
System.out.println("Mondays are bad.");
break;


case FRIDAY:
System.out.println("Fridays are better.");
break;


case SATURDAY:
case SUNDAY:
System.out.println("Weekends are best.");
break;


default:
System.out.println("Midweek days are so-so.");
break;
}
}
}

关于编程的文章。指南: 打开枚举


enum MyEnum { CONST_ONE, CONST_TWO }


class Test {
public static void main(String[] args) {
MyEnum e = MyEnum.CONST_ONE;


switch (e) {
case CONST_ONE: System.out.println(1); break;
case CONST_TWO: System.out.println(2); break;
}
}
}

字符串交换机是在 Java7中实现的。

首先,您可以在 Java 中打开 enum。我猜你是想说你不能,但你可以。char有一个设定的值范围,所以很容易比较。弦可以是任何东西。

在基础编译中,switch语句通常作为 跳跃表(分支表)实现,这只有在有限的值集合中才可能实现。字符串上的 C # 可以开关,但是它会导致性能下降,因为不能使用跳转表。

Java7和更高版本支持具有相同特征的 String开关

您可能在开关案例中错误地使用了枚举。与上面 CoolBeans 的例子相比。.你可能会做以下事情:

switch(day) {
case Day.MONDAY:
// Something..
break;
case Day.FRIDAY:
// Something friday
break;
}

确保使用实际的枚举值而不是 EnumType.EnumValue

Eclipse 指出了这个错误。

实际上,你可以在 Java 中使用一个带有 String 的 switch 语句... ... 不幸的是,这是 Java7的一个新特性,大多数人还没有使用 Java7,因为它太新了。

实际上可以在 enum上使用 switch,但是在 Java7之前不能在 String上使用 switch。您可以考虑对 Javaenum使用多态方法分派,而不是使用显式的 switch。请注意,enum是 Java 中的对象,而不仅仅是像 C/C + + 中那样的 int符号。您可以在 enum类型上有一个方法,然后不用编写 switch,只需调用方法-一行代码: done!

enum MyEnum {
SOME_ENUM_CONSTANT {
@Override
public void method() {
System.out.println("first enum constant behavior!");
}
},
ANOTHER_ENUM_CONSTANT {
@Override
public void method() {
System.out.println("second enum constant behavior!");
}
}; // note the semi-colon after the final constant, not just a comma!
public abstract void method(); // could also be in an interface that MyEnum implements
}


void aMethodSomewhere(final MyEnum e) {
doSomeStuff();
e.method(); // here is where the switch would be, now it's one line of code!
doSomeOtherStuff();
}