【问题标题】:Switch on Enum in Java [duplicate]在Java中打开枚举[重复]
【发布时间】:2011-06-17 20:59:14
【问题描述】:

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

【问题讨论】:

  • 向我们展示您的非工作枚举切换代码。
  • 为什么要重复标记,看看标题有多精确,新用户很容易找到。
  • 你可以看看这篇文章看看它是怎么做的:tutorialspoint.com/javaexamples/method_enum.htm
  • "这看起来很简单,而且可以编写一些方便的代码。"是的,Java 很简单,但方便 Java 不是!执行 switch 语句的真正简单方法就像在 C 中一样,而 Java 就是这样做的!原则上,Java 不像 C# 那样方便。这就是 Java 的生活方式。如果你真的想用 Java 编写代码,你必须克服这种心态。
  • 您收到此错误是因为您尝试输入 case enumName.Value 您必须输入 switch(enumVariable) {case value:}

标签: java


【解决方案1】:

你绝对可以打开枚举。来自Java tutorials 的示例。

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

【讨论】:

  • 漂亮的例子很好地回答了这个问题。也就是说,我已经编写 Java 14 年了,我不记得有一个案例是我在生产代码中保留了 switch 语句。当 switch 语句比一系列 if/else 更好时,我总是在我的枚举上编写一个实例方法,而不是按照 Josh Bloch 的建议。在我的Day 枚举中,我添加了public string tellItLikeItis() { return "Midweek days are so-so."; },然后让MONDAYFRIDAYSATURDAYSUNDAY 覆盖该方法。
  • 也就是说,我按照@GregMattes 在第二受欢迎的答案中所建议的那样去做。
  • @GlenPeterson 仅供参考,如果您想优化速度,switch 语句方法可能会更快,因为它只是字节码中的表查找。使用您的方法,您必须将一个新函数推入堆栈。这是一个微优化,但如果速度非常重要,请牢记这一点。
  • @GlenPeterson,假设您正在自己编译枚举代码,但显然并非总是如此。
【解决方案2】:

您实际上可以在enums 上switch,但在Java 7 之前您不能在Strings 上switch。您可以考虑使用Java enums 的多态方法分派而不是显式@ 987654327@。请注意,enums 是 Java 中的对象,而不仅仅是 ints 的符号,就像它们在 C/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();
}

【讨论】:

  • 这种方法的好处之一是根本不可能出现某些类型的错误。你不能错过一个 switch 案例(你可以错误地为一个特定的常量实现一个方法,但是没有什么可以完全阻止这种情况的发生!)。无需担心“默认”开关。此外,我已经看到将枚举常量放入数组然后索引到数组中的代码 - 这打开了数组索引超出范围异常的可能性 - 只需使用枚举! Java 枚举非常非常强大。尽可能了解它们以有效地使用它们。
  • 还请注意,如果您有多个枚举常量,它们对于特定方法都具有相同的行为(例如 @CoolBeans 星期几的示例,其中周末具有相同的行为,而工作日的星期二到星期四也有相同的行为)共享相同的行为),您可以简单地将共享代码收集在未被每个常量(最终受保护)覆盖的枚举方法中,然后从适当的方法中调用该方法。因此,在我的示例中,我可以添加“final protected void commonMethod() { ... }”,然后在每个常量中实现 method() 只需调用 commonMethod()。
  • 现在这个问题已作为重复问题关闭,我注意到其中一个重复问题的答案与我的非常相似(也许很奇怪):stackoverflow.com/questions/2663980/… - 童子军的荣誉:我不知道在我写我之前关于他的回答!
  • :-)。这个问题最终变成了train-wreck
  • 为什么?因为它是重复的?它发生了,没什么大不了的。也许有一天这些信息会被合并。你学到了一些东西,对吧?其他人可能也这样做了。仅这一点就很有价值。
【解决方案3】:

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

switch 语句通常在底层编译中实现为jump table (branch table),这仅适用于有限的值集。 C#可以开启字符串,但是由于不能使用跳转表导致性能下降。

Java 7 及更高版本支持具有相同特性的String switches

【讨论】:

  • 一些代码示例会很有帮助...
【解决方案4】:

编程文章.指南:Switch on enum


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

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

【讨论】:

    【解决方案5】:

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

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

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

    Eclipse 指出了这个错误..

    【讨论】:

    • +1 但是我发现分配的时候一定要用day = Day.Monday;否则我会收到“找不到符号”编译错误。
    【解决方案6】:

    实际上,您可以在 Java 中使用带有字符串的 switch 语句...不幸的是,这是 Java 7 的新功能,大多数人还没有使用 Java 7,因为它太新了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 2019-02-09
      • 2011-09-04
      相关资源
      最近更新 更多