2 回答
![?](http://img1.sycdn.imooc.com/54584f8f00019fc002200220-100-100.jpg)
TA贡献1825条经验 获得超6个赞
如果你有类似的东西
public class YourComponent extends JFrame { // or whatever it is you're extending
// ....
public void init() {
// ...
byte numButtonClicks = 0;
tellingIntroButton.addActionListener(e -> {
numButtonClicks ++;
System.out.println(numButtonClicks);
});
}
// ...
}
您会遇到一些问题。
匿名内部类(例如您的动作侦听器)中使用的变量必须隐式为final。您在对另一个答案的评论中提到的例外,
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Local variable numButtonClicks defined in an enclosing scope must be final or effectively final
告诉您计数器变量不是最终变量
您正在使用一个byte字段作为计数器。为什么不选择aint或a long?
您不能声明finalint或long方法内部并对其进行递增。
您可以通过在班级中拥有一个成员来解决此问题,例如
public class YourComponent extends JFrame { // or whatever it is you're extending
// ....
private int numButtonClicks = 0;
public void init() {
// ...
tellingIntroButton.addActionListener(e -> {
YourComponent.this.numButtonClicks++;
System.out.println(numButtonClicks);
});
}
// ...
}
或者,就像其他答案所暗示的那样,如果并发在这里对您来说是一个问题(如果可以通过不同的线程修改计数),则可以使用java8对象,例如LongAdder。如果您使用此路线(LongAdder),则在方法范围内声明它时,必须将其声明为final。
![?](http://img1.sycdn.imooc.com/545864490001b5bd02200220-100-100.jpg)
TA贡献1836条经验 获得超3个赞
您能让我知道您得到的确切错误是什么。如果numButtonClicks是局部变量,则无法在lambda函数中对捕获的局部变量进行突变。使它成为一个LongAdder类变量,该变量是原子的并为并发而设计。
LongAdder numButtonClicks= new LongAdder();
tellingIntroButton.addActionListener(e -> {
numButtonClicks.increment();
System.out.println(numButtonClicks);
});
添加回答
举报