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实现中改变出来。
因为语言设计者认为如果匿名内部类引用的变量被更改会令人困惑。 如果不是这种情况,那么匿名类引用的所有局部变量引用都必须被提升为该类的字段。
- 如何在MyLocationOverlay中为“你在这里”点使用自定义位图?
- 具有可变JsonProperty的Jackson Generics(使用generics)
- Java int零前缀?
- 使用App Engine数据存储区查找重叠范围
- JAVA RSA解密无法正常工作,抛出InvalidKeySpecException
- org.openqa.selenium.WebDriverException:chrome无法访问 – 尝试启动新会话时
- 使用android.gms.drive从android删除/删除文件
- Android:如何永久和完全不显示EditText的默认软键盘?
- 获取Android Studio应用中的当前位置