Java决赛 - 一个持久的谜团

mal*_*ngi 2 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("");
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ett 8

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

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