犯罪嫌疑人X
2019-05-27 11:09:04
為什么在匿名類中只能訪問最終變量?a只能在這里決賽。為什么?如何a在onClick()不將其保留為私有成員的情況下重新分配方法?private void f(Button b, final int a){
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int b = a*5;
}
});}如何5 * a點擊它返回?我的意思是,private void f(Button b, final int a){
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int b = a*5;
return b; // but return type is void
}
});}
3 回答

一只名叫tom的貓
TA貢獻(xiàn)1906條經(jīng)驗 獲得超3個贊
有一個技巧允許匿名類更新外部作用域中的數(shù)據(jù)。
private void f(Button b, final int a) { final int[] res = new int[1]; b.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { res[0] = a * 5; } }); // But at this point handler is most likely not executed yet! // How should we now res[0] is ready?}
但是,由于同步問題,這個技巧不是很好。如果稍后調(diào)用handler,則需要1)如果從不同的線程調(diào)用處理程序,則同步對res的訪問2)需要有某種標(biāo)志或指示res已更新
但是,如果在同一個線程中立即調(diào)用匿名類,這個技巧就可以了。喜歡:
// ...final int[] res = new int[1];Runnable r = new Runnable() { public void run() { res[0] = 123; } };r.run();System.out.println(res[0]);// ...

Helenr
TA貢獻(xiàn)1780條經(jīng)驗 獲得超4個贊
匿名類是內(nèi)部類,嚴(yán)格規(guī)則適用于內(nèi)部類 (JLS 8.1.3):
使用但未在內(nèi)部類中聲明的任何局部變量,形式方法參數(shù)或異常處理程序參數(shù)必須聲明為final。任何在內(nèi)部類中使用但未聲明的局部變量必須在內(nèi)部類的主體之前明確賦值。
我還沒有找到關(guān)于jls或jvms的原因或解釋,但我們知道,編譯器為每個內(nèi)部類創(chuàng)建一個單獨的類文件,并且必須確保在此類文件上聲明的方法(在字節(jié)代碼級別上)至少可以訪問局部變量的值。
(Jon有完整的答案 - 我保留這個未刪除的,因為有人可能對JLS規(guī)則感興趣)
添加回答
舉報
0/150
提交
取消