2 回答

TA貢獻1825條經(jīng)驗 獲得超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);
});
}
// ...
}
您會遇到一些問題。
匿名內(nèi)部類(例如您的動作偵聽器)中使用的變量必須隱式為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
告訴您計數(shù)器變量不是最終變量
您正在使用一個byte字段作為計數(shù)器。為什么不選擇aint或a long?
您不能聲明finalint或long方法內(nèi)部并對其進行遞增。
您可以通過在班級中擁有一個成員來解決此問題,例如
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);
});
}
// ...
}
或者,就像其他答案所暗示的那樣,如果并發(fā)在這里對您來說是一個問題(如果可以通過不同的線程修改計數(shù)),則可以使用java8對象,例如LongAdder。如果您使用此路線(LongAdder),則在方法范圍內(nèi)聲明它時,必須將其聲明為final。

TA貢獻1836條經(jīng)驗 獲得超3個贊
您能讓我知道您得到的確切錯誤是什么。如果numButtonClicks是局部變量,則無法在lambda函數(shù)中對捕獲的局部變量進行突變。使它成為一個LongAdder類變量,該變量是原子的并為并發(fā)而設計。
LongAdder numButtonClicks= new LongAdder();
tellingIntroButton.addActionListener(e -> {
numButtonClicks.increment();
System.out.println(numButtonClicks);
});
添加回答
舉報