java - final 局部变量无法赋值,因为它是在封闭类型中定义的

标签 java inner-classes final

ratingS = new JSlider(1, 5, 3); 
ratingS.setMajorTickSpacing(1);
ratingS.setPaintLabels(true);
int vote;

class SliderMoved implements ChangeListener {
    public void stateChanged(ChangeEvent e) {
        vote = ratingS.getValue();
    }
}

ratingS.addChangeListener(new SliderMoved());

如果我写上面的代码,Eclipse 会告诉我:

Cannot refer to a non-final variable vote inside an inner class defined in a different method

但是如果我在 int vote 之前添加 final 它会给我这个错误:

The final local variable vote cannot be assigned, since it is defined in an enclosing type

那么,如何解决呢?

最佳答案

嗯,标准技巧是使用长度为 1 的 int 数组。使 var 最终并写入 var[0]。确保不造成数据竞争非常重要。以您的代码为例:

final int[] vote = {0};

class SliderMoved implements ChangeListener {
  public void stateChanged(ChangeEvent e) {
    vote[0] = ratingS.getValue();
  }
}

由于所有这些都将在 EDT 上发生,包括回调调用,您应该是安全的。您还应该考虑使用匿名类:

ratingS.addChangeListener(new ChangeListener() {
  public void stateChanged(ChangeEvent e) { vote[0] = ratingS.getValue(); }
});

关于java - final 局部变量无法赋值,因为它是在封闭类型中定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21485590/

相关文章:

java - 内部类访问外部类方法,方法名相同

java - 在调用父类(super class)型构造函数之前无法引用 "X",其中 x 是最终变量

java - 复合继承: how to assign a final field at sub-class constructor which depends on 'this' value (backward reference)?

java - 从 Java 启动守护进程

java - 如何使用gui的java代码在cmd上运行两个c++文件

java - 当我获取列名时出现耗尽结果集错误

java - 在 Java 中按键订购 HashMap 的最佳方式?

java - 以内部类作为参数的Spring Controller

c++ - 为什么要在 C++ 中使用嵌套类?

java - lambda 表达式中的变量赋值