3 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
有一個(gè)技巧允許匿名類更新外部作用域中的數(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?}
但是,由于同步問(wèn)題,這個(gè)技巧不是很好。如果稍后調(diào)用handler,則需要1)如果從不同的線程調(diào)用處理程序,則同步對(duì)res的訪問(wèn)2)需要有某種標(biāo)志或指示res已更新
但是,如果在同一個(gè)線程中立即調(diào)用匿名類,這個(gè)技巧就可以了。喜歡:
// ...final int[] res = new int[1];Runnable r = new Runnable() { public void run() { res[0] = 123; } };r.run();System.out.println(res[0]);// ...

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