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吗?
要求是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.
(此外,即使字段不是最终的,你也不会遇到死锁.如果它们没有在父对象或类上正确同步,你会得到的线程可能会看到字段的陈旧值.)
所以你的问题的答案是:
static final,并且switch语句将编译,但是static final将其声明为无效.嵌套类怎么样?
这没有任何区别.