Подтвердить что ты не робот

Конечная переменная в методах Java

Возможный дубликат:
Зачем отмечать локальные переменные и параметры метода как "final" в Java?

Я проверял некоторый Java-код, я не очень хорошо разбираюсь в java, по крайней мере, знаю, что такое final, например, запечатанные классы, поля только для чтения и неперехваченные методы, но это выглядит странно для меня, объявляя переменную final в методы:

private static void queryGoogleBooks(JsonFactory jsonFactory, String query) throws Exception {
    // Set up Books client.
    final Books books = Books.builder(new NetHttpTransport(), jsonFactory)
        .setApplicationName("Google-BooksSample/1.0")
        .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
          @Override
          public void initialize(JsonHttpRequest request) {
            BooksRequest booksRequest = (BooksRequest) request;
            booksRequest.setKey(ClientCredentials.KEY);
          }
        })
        .build();

Не могли бы вы рассказать мне, что означает значение final в этом контексте?

Вот полный код:

http://code.google.com/p/google-api-java-client/source/browse/books-cmdline-sample/src/main/java/com/google/api/services/samples/books/cmdline/BooksSample.java?repo=samples

4b9b3361

Ответ 1

Это просто делает локальную переменную books неизменной. Это означает, что он всегда будет ссылкой на тот же самый Book объект, который создается и строится, и не может быть изменен для ссылки на другой объект или null.

Сам объект Book по-прежнему изменяется, как видно из последовательности вызовов доступа. Только ссылка на него отсутствует.

Ответ 2

В этом случае final Books books просто означает, что books должно быть назначено значение ровно один раз.

Мне нравится использовать ключевое слово final как это, так как оно показывает намерение переменной, которое я считаю ценной информацией при просмотре кода, поскольку он удаляет еще одну переменную из ситуации... так сказать.

Если я не отмечаю переменную как final, тогда она выделяется как что-то, на что нужно следить, потому что скоро она изменит значения. Эта информация полезна, например, при прохождении кода в отладчике или рефакторинге и перемещении кода.

Ответ 3

Это также делает переменную ссылкой только для чтения. Обычно это защищает код от случайной модификации переменной, которая не должна меняться.

Ответ 4

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

Ответ 5

Этот код использует анонимный класс JsonHttpRequestInitializer, где он ссылается на локальную переменную в методе queryGoogleBooks, проблема в подобной ситуации заключается в том, что метод queryGoogleBooks может вернуться до завершения инициализации метода JsonHttpRequestInitializer, где он может очистить переменная и может привести к сбою инициализации метода JsonHttpRequestInitializer. Поэтому требуется объявлять переменные как окончательные в подобных ситуациях. Для получения дополнительной информации см.

Нельзя ссылаться на не конечную переменную внутри внутреннего класса, определенного другим методом