【问题标题】:Java Final - an enduring mysteryJava Final - 一个不朽的谜团
【发布时间】:2010-02-23 18:36:34
【问题描述】:
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。这是为什么呢?

【问题讨论】:

  • 目前你不会相信 lambda-dev 邮件列表上正在进行的讨论。

标签: java


【解决方案1】:

它是一个内部类,传递给addKeyUpHandler——所有在内部类外部引用的变量都需要声明为final才能在内部类中使用。这是因为本地类实例必须维护变量的单独副本,因为它可能会超出函数的寿命;为了不让两个同名的可修改变量在同一个作用域内产生混淆,强制变量不可修改。

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

【讨论】:

    【解决方案2】:

    因为 Java 没有 *真正的闭包* ! ;-)

    请参阅this 帖子以了解其实际实现方式。

    【讨论】:

      【解决方案3】:

      这样它就不会从匿名内部类 KeyUpHandler 实现下更改出来。

      【讨论】:

        【解决方案4】:

        因为语言设计者认为如果更改了匿名内部类引用的变量会造成混乱。如果不是这种情况,则必须将匿名类引用的所有局部变量引用提升为该类的字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多