gpt4 book ai didi

java - case 表达式中的非静态变量?

转载 作者:行者123 更新时间:2023-11-29 10:06:54 25 4
gpt4 key购买 nike

我想从另一个类访问一个公共(public)整数,以便在如下 switch 语句中使用:

StateManager sm = new StateManager(0);

switch (localState) {
case (sm.ALL_COMPANIES_REQUEST): {
//do something
}
case (sm.GENERAL_TICKER_REQUEST): {
//do this instead
}

但是,这些变量需要被多个线程访问,所以我不想让它们成为静态的。不幸的是,我收到一条错误消息,指出 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
}

但是,您对静态常量和线程的担忧是没有根据的。 final 字段的规范明确指出它们可以在不同步的情况下安全读取;见JLS 17.5 .

(此外,即使字段不是最终的,您也不会遇到死锁。如果线程未正确同步,您将得到的是线程可能看到字段的陈旧值父对象或类。)

所以你的问题的答案是:

  • 如果常量是一个编译时常量,你可以声明为 static final switch 语句会编译,但是
  • 如果常量不是编译时常量,则将其声明为 static final 无济于事。

How about nesting the classes?

那不会有任何区别。

关于java - case 表达式中的非静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5280823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com