![](/img/trans.png)
[英]Java: the final local variable cannot be assigned, since it was defined in an enclosing type
[英]The final local variable cannot be assigned, since it is defined in an enclosing type
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告诉我这个:
不能在不同方法中定义的内部类中引用非最终变量vote
但如果我在int vote之前添加final ,它会给我这个错误:
无法分配最终的局部变量投票,因为它是在封闭类型中定义的
那么,如何解决?
好吧,标准技巧是使用长度为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(); }
});
将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();
我终于在主类中将声明声明为实例变量(私有)。
将编译器合规性级别设置为1.8对我来说可以解决类似的问题。 我不明白原因,但你可以试试这个。
这个怎么运作:
右键单击项目 - > Properties - > Java Compiler。 在java编译器属性窗口中,将编译器合规性级别设置为1.8。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.