【问题标题】:Why does Java disallow switch on static enums?为什么 Java 不允许打开静态枚举?
【发布时间】:2013-05-13 11:39:09
【问题描述】:

我必须使用一个定义像这样的枚举的库:

public static enum LibVal {
    VAL_1,
    VAL_2,
    VAL_3;
}

我将此枚举作为方法参数:

public void libCallback(LibVal val){
    //.... some implementation
}

为什么Java 不允许在libCallback 方法中使用LibVal 枚举switch?但是,如果 lib 已将其枚举声明为非静态,它将起作用。这令人困惑,因为SO-answer 指出,实际上没有区别......

编辑:

正如 bobkilla 所说:我在我的交换机中尝试了 LibVal.VAL_1,这应该是允许的。 我提供了一个不起作用的代码示例!

class TestClassForEnum {
    public static enum TestEnum{ ONE, TWO; }
}

class WhichUsesEnumInsideMethod{

    //completely unrelated to TestClassForEnum.TestEnum!!!
    public static final int ONE = 0x1282

    void doSomethingWithEnum(TestEnum e){
        //here I cannot switch:

        //FORBIDDEN BY JAVA
        switch (e) {
            case TestEnum.ONE:
                    //...

        }

        //Cannot USE EITHER, because ONE is a static final int inside this scope?!:
        switch (e) {
            case ONE:
                    //...

        }

 }

【问题讨论】:

  • 展示你如何尝试switch
  • 什么是编译错误?
  • 它并没有禁止它。没有提供任何证据。不是一个真正的问题。
  • @EJP 抱歉,我赶时间。我更新了我的问题以提供证据

标签: java static enums switch-statement


【解决方案1】:

这行不通:

switch(val) {
            case LibVal.VAL_1: System.out.println("VAL_1 was chosen");
        }

这会起作用:

switch(val) {
            case VAL_1: System.out.println("VAL_1 was chosen");
        }

【讨论】:

  • 哦,你是对的。我尝试了LibVal.VAL_1,但它不起作用。你知道为什么我不允许在它前面加上 LibVal 吗?
  • 我不知道为什么,我只知道如果你使用前缀它不会编译。对于您的“ONE”问题,我认为这是因为 ONE 是此范围内的静态 final int。
  • 是的,当然是。这就是为什么我最初认为,我根本无法切换枚举......
【解决方案2】:

所有枚举默认都是静态的,没有区别。您可以打开任何枚举,无论您是否将其设为静态。

在此处查看此示例http://ideone.com/n5oQoi

public class Main {
    public static enum LibVal {
        VAL_1,
        VAL_2,
        VAL_3;
    }

    public void libCallback(LibVal val){
        switch(val) {
            case VAL_1: System.out.println("VAL_1 was chosen");
        }
    }

    public static void main(String[] ignored) {
        new Main().libCallback(LibVal.VAL_1);
    }
}

【讨论】:

    【解决方案3】:
    // your method signature:
    public void libCallback(LibVal val){
        switch (val) {
        case VAL_1: System.out.println("It"); break;
        case VAL_2: System.out.println("works"); break;
        case VAL_3: System.out.println("fine"); break;
        default:    System.out.println("here.");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      相关资源
      最近更新 更多