无法分配最终的局部变量,因为它是在封闭类型中定义的

时间:2014-01-31 16:53:22

标签: 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会告诉我:

  

不能引用内部类中的非最终变量投票   用不同的方法定义

但如果我在 int vote 之前添加最终,则会出现此错误:

  

无法分配最终的局部变量投票,因为它是在封闭类型中定义的

那么,如何解决?

4 个答案:

答案 0 :(得分:27)

嗯,标准技巧是使用长度为1的int数组。使var final并写入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(); }
});

答案 1 :(得分:5)

vote移至SliderMoved

class SliderMoved implements ChangeListener {
    private int vote;
    public void stateChanged(ChangeEvent e) {
        this.vote = ratingS.getValue();
        // do something with the vote, you can even access
        // methods and fields of the outer class
    }
    public int getVote() {
        return this.vote;
    }
}

SliderMoved sm = new SliderMoved();
ratingS.addChangeListener(sm);

// if you need access to the actual rating...
int value = rattingS.getValue();

// ...or
int value2 = sm.getVote();

修改

或者,将模型类传递给更改侦听器

public class Person {
    private String name;
    private int vote;
    public int getVote() {
        return this.vote;
    }
    public void setVote(int vote) {
        this.vote = vote;
    }
    // omitting other setter and getter
}

Person的用法如下:

 class SliderMoved implements ChangeListener {
    private Person person;
    public SliderMoved(Person person) {
        this.person = person;
    }
    public void stateChanged(ChangeEvent e) {
        this.person.setVote(ratingS.getValue());
    }
    public Person getPerson() {
        return this.person;
    }
}

Person person = new Person();

ratingS.addChangeListener(new SliderMoved(person));

// access the vote
int vote = person.getVote();

答案 2 :(得分:2)

我终于解决了在主类中声明为实例变量(私有)的问题。

答案 3 :(得分:2)

将编译器合规性级别设置为1.8对我来说可以解决类似的问题。我不明白原因,但你可以尝试一下。

工作原理:

右键点击该项目 - >属性 - > Java编译器。在java编译器属性窗口中,将编译器合规性级别设置为1.8。