Java Final - вечная загадка - PullRequest
       23

Java Final - вечная загадка

2 голосов
/ 23 февраля 2010
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) как окончательный.Почему это так?

Ответы [ 4 ]

8 голосов
/ 23 февраля 2010

Это внутренний класс, переданный в addKeyUpHandler - все переменные, на которые есть ссылки вне внутреннего класса, должны быть объявлены как final для использования во внутреннем классе. Это связано с тем, что экземпляр локального класса должен поддерживать отдельную копию переменной, так как он может переиграть функцию; чтобы не путать две изменяемые переменные с одинаковыми именами в одной и той же области видимости, переменная вынуждена быть неизменяемой.

Просто выполните final {type} {new-varname} = {old-varname}; перед вызовом метода, который использует внутренний класс, а затем используйте {new-varname} внутри него.

2 голосов
/ 23 февраля 2010

Поскольку у Java нет * реальных замыканий *!; -)

См. этот пост, чтобы узнать, как это на самом деле реализовано.

0 голосов
/ 23 февраля 2010

Поскольку разработчики языка думали, что было бы странно, если бы переменная, на которую ссылается анонимный внутренний класс, была изменена. Если бы это было не так, все ссылки на локальные переменные, на которые ссылается анонимный класс, должны быть отменены, чтобы быть полями этого класса.

0 голосов
/ 23 февраля 2010

, чтобы он не мог измениться из-за реализации KeyUpHandler анонимного внутреннего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...