在Java中启用Enum

use*_*321 137 java

可能重复:
编译错误 - 使用枚举切换
为什么我的枚举常量引用无法在案例标签中限定?

为什么不能在Java中打开枚举?它似乎很简单,并且可以制作一些方便的代码.这个问题也适用于String.你可以打开一个char,但不是String......?

Coo*_*ans 255

你绝对可以打开枚举.从Java教程发布的示例.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @GlenPeterson仅供参考,如果您正在尝试优化速度,则switch语句方法可能会更快,因为它只是字节码中的表查找.使用您的方法,您必须将新功能推送到堆栈.这是一个微观优化,但如果速度非常重要,那就要记住了. (3认同)
  • 很好地回答这个问题的美丽例子.也就是说,我已经编程了14年Java,我不记得在生产代码中保留switch语句的一个案例.当一个switch语句比一系列if/else更好时,我总是在我的枚举上编写一个实例方法,而不是Josh Bloch建议的那样.在我的`Day`枚举中,我添加`public string tellItLikeItis(){return"周中的日子一般都是这样."; 然后``MONDAY`,`FRIDAY`,`SATURDAY`和`SUNDAY`覆盖该方法. (2认同)
  • @GlenPeterson,假设您自己编译枚举代码,显然情况并非总是如此。 (2认同)

Gre*_*tes 75

实际上你可以switch使用enums,但是switchStringJava 7之前你不能使用.你可以考虑使用Java enums而不是显式的多态方法调度switch.请注意,enums是Java中的对象,而不仅仅是intC/C++中的符号.你可以在一个enum类型上有一个方法,然后代替编写一个switch,只需调用方法 - 一行代码:完成!

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();
}
Run Code Online (Sandbox Code Playgroud)

  • +1:从未见过用过这种方式.有趣. (19认同)
  • 这种方法的一个好处是,根本不可能得到某些类型的错误.你不能错过一个开关案例(你可能会错误地为一个特定的常量实现一个方法,但没有什么能完全阻止这种情况发生!).没有开关"默认"担心.此外,我已经看到将枚举常量放入数组然后索引到数组中的代码 - 这打开了数组索引超出范围异常的可能性 - 只需使用枚举!Java枚举非常非常强大.了解有关他们的所有信息,以便有效地使用它们. (3认同)
  • 另请注意,如果您有几个枚举常量,对于特定方法都具有相同的行为(例如@CoolBeans星期几示例,其中周末天具有相同的行为,工作日周二到周四也有相同的行为),您可以只需在枚举方法中收集共享代码,该方法不会被每个常量(最终保护)覆盖,然后从适当的方法调用该方法.所以,在我的例子中,我可以添加"final protected void commonMethod(){...}",然后在每个常量中实现method()只会调用commonMethod(). (2认同)
  • 为什么?因为它是重复的?它发生了,没什么大不了的.也许这些信息有一天会被合并.你学到了什么,对吧?其他人可能也做了.仅这一点就有价值. (2认同)

Mic*_*man 26

首先,您可以enum在Java中打开它.我猜你打算说你不能,但你可以.chars有一组设定值,因此很容易比较.字符串可以是任何东西.

switch语句通常作为一个实现跳转表(分支表)中的底层的编译,这是唯一可能具有有限的一组值.C#可以打开字符串,但由于无法使用跳转表,因此会导致性能下降.

Java 7及更高版本支持具有相同特征的String交换机.

  • +1用于架构解释. (7认同)

aio*_*obe 22

  • 打开枚举工作正常.

    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;
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    ideone.com演示

  • 字符串的开关在Java 7中实现.

    阅读这里的所有新功能.


bra*_*yne 14

您可能在切换案例中错误地使用了枚举.与CoolBeans的上述示例相比,您可能会执行以下操作:

switch(day) {
    case Day.MONDAY:
        // Something..
        break;
    case Day.FRIDAY:
        // Something friday
        break;
}
Run Code Online (Sandbox Code Playgroud)

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

Eclipse指出了这个错误.


归档时间:

查看次数:

354349 次

最近记录:

8 年,4 月 前