Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Final-一个永恒的谜_Java - Fatal编程技术网

Java Final-一个永恒的谜

Java Final-一个永恒的谜,java,Java,我无法理解为什么java强制我将ArrayList(candiateNames)声明为final。这是为什么?它是一个内部类,传递到addKeyUpHandler——内部类外部引用的所有变量都需要声明为final,以便在内部类中使用。这是因为本地类实例必须维护变量的一个单独副本,因为它可能会超出函数;为了避免在同一范围内混淆两个同名的可修改变量,该变量被强制为不可修改变量 只需执行final{type}{new varname}={old varname},然后在内部使用{new varname

我无法理解为什么java强制我将
ArrayList
candiateNames
)声明为final。这是为什么?

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


只需执行
final{type}{new varname}={old varname},然后在内部使用
{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("");
      }
    }
  }
});