Почему книга говорит, что финал нужен здесь? - PullRequest
4 голосов
/ 18 января 2020

Этот код из книги Мышление в Java. Я не знаю, почему я должен добавить синтаксис final здесь. Я удалил final, и программа все еще скомпилирована. Однако в книге сказано, что я должен добавить это.

// initialization. A briefer version of Parcel5.java.
public class Parcel9 {
    // Argument must be final to use inside
    // anonymous inner class:
    public Destination destination(final String dest) {
        return new Destination() {
            private String label = dest;
            public String readLabel() { return label; }
        };
    }
    public static void main(String[] args) {
        Parcel9 p = new Parcel9();
        Destination d = p.destination("Tasmania");
    }
} ///:~

1 Ответ

11 голосов
/ 18 января 2020

Весьма вероятно, что книга (или глава / раздел) была написана до Java 8 возраста.

Java накладывает ограничение на анонимные классы, которые могут не иметь доступа к локальной переменной, если только final.

В Java 8 это ограничение применимо и к лямбда-выражениям. Но, в дополнение к этому, Java 8 добавил понятие эффективно окончательное , что делает компилятор умнее, заставляя его определять, что переменная является конечной, потому что она не переназначается локально, тем самым делая явное использование ключевого слова final необязательно в таких случаях.

Итак, если вы скомпилируете этот код на Java 7 или старше, вы получите ошибку компилятора, которую книга учит своих читателей избегать .

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