【问题标题】:Why can't I use enums for switch-case-statements?为什么我不能将枚举用于 switch-case 语句?
【发布时间】:2020-03-27 21:50:07
【问题描述】:

我想将枚举常量用于 switch-case-statements。

我正在使用以下枚举/类:

public enum Cons {

  ONE(1), 
  TWO(2);

  private final int val;

  private Cons(final int newVal) {
    val = newVal;
  }

  public int getVal() {
    return val;
  }
}



public class Main {

  public static void main(String[] args) {

    int test;

    // some code

    switch(test) {
        case Cons.ONE.getVal():
            // ...
            break;
        case Cons.TWO.getVal(): 
            // ...
            break;
        default:
            // ...
    }
  }
}

问题: “case 表达式必须是常量表达式” => 我的枚举值不是常量,尽管属性 private final int val 被声明为 final。

如何将此枚举用于案例陈述?

【问题讨论】:

    标签: java enums switch-statement case-statement


    【解决方案1】:

    案例标签必须是编译时常量表达式。方法调用不是其中之一。

    您可以做的就是将 test 更改为 Cons。然后就可以在switch中使用了:

    Cons test;
    
    // some code
    
    switch(test) {
        case Cons.ONE:
            // ...
            break;
        case Cons.TWO: 
            // ...
            break;
        default:
            // ...
    }
    

    如果您必须使用int,请创建一个使用该值返回正确枚举实例的方法。

    Cons lookUpByVal(int test) { ... }
    
    switch(lookUpByVal(test)) {
         case Cons.ONE:
         ...
    

    【讨论】:

    • 好的,第一部分我明白了。但是如果我将int test 更改为Cons test,test 就不再是整数了。那么为什么我应该将 Cons-Object 与整数进行比较,我什至如何初始化枚举对象呢?你的第二点:我不知道如何在代码中使用Cons lookUpByVal(int test) { ... }。我复制了你的代码并得到了多个语法错误:d
    • 你没有初始化 Cons 对象。它们已经存在:它们是 Cons.ONE 和 Cons.TWO。至于第二点:你可以写例如if (test==1) return Cons.ONE; if (test==2) return Cons.TWO你可以通过使用列表或映射或其他数据结构来变得更花哨。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多