试图找到Java';的解决方法时出错;s要求switch语句中的案例必须是最终案例

试图找到Java';的解决方法时出错;s要求switch语句中的案例必须是最终案例,java,switch-statement,final,Java,Switch Statement,Final,我试图找到一种解决Java要求的方法,即switch语句中的案例必须是最终的。到目前为止,我的尝试失败了,我不确定为什么会发生这种情况。除非绝对必要,否则我宁愿使用switch语句而不是if/else语句 我的目标是创建一个switch语句,其大小写取决于非最终变量的值。Java要求大小写保持不变 为了绕过这个要求,我尝试用非最终变量的值创建最终变量。这样,最终变量可以用作案例,同时仍然具有非最终变量的值 将局部变量或实例变量的值赋给最终变量会导致编译器错误(局部变量的方法为test2,实例变量

我试图找到一种解决Java要求的方法,即switch语句中的案例必须是最终的。到目前为止,我的尝试失败了,我不确定为什么会发生这种情况。除非绝对必要,否则我宁愿使用switch语句而不是if/else语句

我的目标是创建一个switch语句,其大小写取决于非最终变量的值。Java要求大小写保持不变

为了绕过这个要求,我尝试用非最终变量的值创建最终变量。这样,最终变量可以用作案例,同时仍然具有非最终变量的值

将局部变量或实例变量的值赋给最终变量会导致编译器错误(局部变量的方法为test2,实例变量的方法为test3)。为什么会发生这种情况

另一方面,将最后一个变量指定给文字常量非常有效(方法test1)

对于Java的限制是否有任何可能的解决方法

class Main {
  private int instance = 0;
  public Main(int i){
      instance = i;
  }
  public void test1(int num){
      final int FINAL = 3;
      switch(num){
          case FINAL:
          System.out.println(FINAL);
          break;
          default:
          System.out.println("nothing");
      }
  }
  // methods test2 and test3 did not compile
  public void test2(int num){
      int locVar = 3;
      final int FINAL = locVar;
      switch(num){
          case FINAL:
          System.out.println(FINAL); // line 20
          break;
          default:
          System.out.println("nothing");
      }
  }
  public void test3(int num){
      final int FINAL = instance;
      switch(num){
          case FINAL:
          System.out.println(FINAL); // line 30
          break;
          default:
          System.out.println("nothing");
      }
  }
  public static void main(String[] args) {
    Main m = new Main(3); // instance variable named int instance = 3
    m.test1(3);
    // m.test2(3);
    // m.test3(3);
  }
}
预期输出(如果要完美工作):

产生错误:第20行和第30行需要常量表达式

我试图找到一种解决Java要求的方法,即switch语句中的案例必须是最终的

这样的努力是徒劳的。假设您希望您的案例标签引用“变量”,则此要求没有解决方法

根据:

每个case标签都有一个case常量,它是常量表达式或枚举常量的名称

因此,甚至不要求案例标签是最终的:这是必须的,常量变量()只是其中的一种

关于常量变量的一个关键点是,
final
是必要的,但还不够

切换情况必须为常量的原因是编译器生成一个跳转表():为了做到这一点,它必须在编译时知道所有可能的跳转

有些语言支持开关中的非常量情况(例如,或Kotlin),但Java不支持


如果要避免常量大小写标签的要求,必须使用替代控制结构(例如if/else)。

开关大小写必须是编译时常量。这是绕不开的。如果没有编译时常量,只需使用
If
语句即可。这并不是说它们必须是最终的。来自JLS 14.11:“每个案例标签都有一个案例常量,可以是常量表达式,也可以是枚举常量的名称。”您无法找到解决方法。开关中的案例必须是常量,即“最终”值。
final
还不够-a是:“…引用常量变量(§4.12.4)…”和“常量变量是使用常量表达式初始化的基元类型或字符串类型的最终变量”
3
3
3