Java决赛 – 一个持久的谜团

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(""); } } } }); 

我还没有理解为什么java强迫我将ArrayList(candiateNames)声明为final? 为什么是这样?

它是一个内部类,传递给addKeyUpHandler – 在内部类之外引用的所有变量都需要声明为final才能在内部类中使用。 这是因为本地类实例必须维护变量的单独副本,因为它可能会超出函数的范围; 为了不在同一范围内混淆两个具有相同名称的可修改变量,该变量被强制为不可修改。

只需做final {type} {new-varname} = {old-varname}; 在调用使用内部类的方法之前,然后在其中使用{new-varname}

因为Java没有*真正的闭包* ! 😉

请参阅此post以了解这是如何实际实现的。

这样它就无法从匿名内部类KeyUpHandler实现中改变出来。

因为语言设计者认为如果匿名内部类引用的变量被更改会令人困惑。 如果不是这种情况,那么匿名类引用的所有局部变量引用都必须被提升为该类的字段。