Java Final-一个永恒的谜
我无法理解为什么java强制我将Java Final-一个永恒的谜,java,Java,我无法理解为什么java强制我将ArrayList(candiateNames)声明为final。这是为什么?它是一个内部类,传递到addKeyUpHandler——内部类外部引用的所有变量都需要声明为final,以便在内部类中使用。这是因为本地类实例必须维护变量的一个单独副本,因为它可能会超出函数;为了避免在同一范围内混淆两个同名的可修改变量,该变量被强制为不可修改变量 只需执行final{type}{new varname}={old varname},然后在内部使用{new varname
ArrayList
(candiateNames
)声明为final。这是为什么?它是一个内部类,传递到addKeyUpHandler
——内部类外部引用的所有变量都需要声明为final,以便在内部类中使用。这是因为本地类实例必须维护变量的一个单独副本,因为它可能会超出函数;为了避免在同一范围内混淆两个同名的可修改变量,该变量被强制为不可修改变量
只需执行
final{type}{new varname}={old varname}在调用使用内部类的方法之前,使用code>,然后在内部使用{new varname}
。因为Java没有*实闭包*!;-)
请参阅post以了解这是如何实际实现的。这样它就不能从匿名内部类KeyUpHandler实现下更改。因为语言设计者认为,如果匿名内部类引用的变量被更改,会使人困惑。如果不是这样的话,匿名类引用的所有局部变量引用都必须被提升为该类的字段。你不会相信lambda dev邮件列表上正在进行的讨论。
suggestBox.addKeyUpHandler( new KeyUpHandler() {
public void onKeyUp(KeyUpEvent event) {
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
String boxText = suggestBox.getText();
if (!boxText.equals("")) {
suggestPanel.add(checkBoxFactory(boxText, candidateNames));
suggestBox.setText("");
}
}
}
});