表达式中的非静态变量?

pro*_*nce 1 java static switch-statement

我想访问另一个类的公共整数,以便在switch语句中使用,如下所示:

StateManager sm = new StateManager(0);

switch (localState) {
    case (sm.ALL_COMPANIES_REQUEST): {
       //do something 
    }
    case (sm.GENERAL_TICKER_REQUEST): {
       //do this instead    
    }
Run Code Online (Sandbox Code Playgroud)

但是,这些变量需要由多个线程访问,因此我不想让它们成为静态的.不幸的是我收到一个错误,说case表达式必须是常量.没有方法可以改变这些变量,它们是不变的,但似乎没有标记它们 static,计算机就无法解决这个问题.有谁知道怎么解决这个问题?

编辑:如何嵌套类,这是一个选项,因为StateManager实际上只对上面带有switch语句的类有用.这足以单独使用final吗?

Ste*_*n C 5

要求是switch语句中的值是常量表达式或枚举值; 见JLS 14.11.

JLS 15.28中描述了常量表达式.本质上,它是一个编译时常量表达式.所以这意味着像这样的东西不会编译:

    static final int foo = someString.length();
    ...
    switch (x) {
        case foo: ...  // case label is not a >>compile time<< constant
    }
Run Code Online (Sandbox Code Playgroud)

但是,您对静态常量和线程的关注是没有根据的.最终字段的规范明确规定可以在没有同步的情况下安全地读取它们; 见JLS 17.5.

(此外,即使字段不是最终的,你也不会遇到死锁.如果它们没有在父对象或类上正确同步,你会得到的线程可能会看到字段的陈旧值.)

所以你的问题的答案是:

  • 如果常量是编译时常量,则可以声明为as static final,并且switch语句将编译,但是
  • 如果常量不是编译时常量,那么static final将其声明为无效.

嵌套类怎么样?

这没有任何区别.