Окончательная интерпретация переменных
Я знаю, как компилятор интерпретирует конечное ключевое слово в Java, но как мы, программисты, интерпретируем его значение? Должно ли быть:
1) Эта переменная не может быть изменена (например, используется внутренним классом)
или
2) Я не планирую изменять эту переменную ( может иметь некоторые преимущества оптимизации для переменных-членов).
Я спрашиваю, потому что я работал над кодом, где все объявлено окончательным по умолчанию (вариант 2 выше), который, на мой взгляд, обесценивает ключевое слово и скрывает значения, которые действительно т изменения! Есть ли преимущества производительности при объявлении переменных final?
Ответы
Ответ 1
Все, что является окончательным по умолчанию, - это хорошо. Чем больше вы можете моделировать свой код на неизменность, тем легче это рассуждать.
Использование final
, по моему мнению, вряд ли будет в производительности. Это о принятии утверждений о остальной части кода (ничего не меняет эту переменную), которые могут помочь читателю понять код и могут быть проверены компилятором.
РЕДАКТОР: Вышеупомянутое - мое представление для полей. Для локальных переменных (включая параметры) я лично использую только final
, когда переменная будет использоваться в анонимном внутреннем классе. Это отличается от полей, потому что:
- Легко видеть весь контекст метода - и если это не так, эта проблема сама по себе.
- Поскольку он не представляет состояние объекта (или класса), преимущества неизменности действительно не применяются.
Ответ 2
Ключевое слово final следует отменить, оно должно быть стандартным во всех применимых случаях, и окончательность должна быть отменена только с помощью ключевого слова, например
this_variable_will_change_unexpectedly_behind_your_back
Это ключевое слово не должно быть автозаполнено какой-либо IDE, и его невозможно будет вставить с помощью Ctrl-V.
Ответ 3
Я написал сообщение об этом некоторое время назад.
Финал помогает читать код:
- без использования final все может быть изменчивым (потенциальный беспорядок)
- он принудительно устанавливает переменную перед ее использованием (полезен в конструкторах)
Используя final, вы сообщаете компилятору что-то о своем коде, и оно помогает вам взамен.
Ответ 4
Второй вариант является защитой. Это останавливает вас от случайного изменения или переназначения. Как таковой, это полезно, и вы можете удалить, когда решите, что хотите изменить эту переменную.
Ответ 5
Я не могу много добавить к тому, что сказал Джон, но только для полноты, JLS 17.5.3 говорит, что конечные поля также могут привести для оптимизации;
Если окончательное поле инициализируется выражением константы времени компиляции (§15.28) в объявлении поля, изменения в конечном поле могут не наблюдаться, поскольку использование этого конечного поля заменяется во время компиляции значение константного выражения.
Ответ 6
Я не понимаю, почему вы считаете, что это недостаток.
Когда я вижу все конечные переменные, это означает, что класс неизменен. Это хорошо, потому что неизменяемые классы по сути являются потокобезопасными.
Ответ 7
конечные переменные хорошие вещи вообще говоря. Обратите внимание, что это означает, что переменная не может быть переназначена, но объект, на который он указывает, может измениться, если он изменен.
Производительность, final
позволяет более агрессивно оптимизация компилятора:
спецификация допускает агрессивную оптимизацию конечных полей. Внутри потока разрешено переупорядочивать чтение конечного поля с теми изменениями конечного поля, которые не имеют места в конструкторе.
Ответ 8
Объявление каждой переменной как final
не девальвации final
. Это помогает разработчикам отлаживать приложение, чтобы исключить возможность изменения переменных, особенно во время многопоточной среды приложения.
С выпуском java 8 у нас есть еще одно понятие под названием " effectively final variable
"
локальные переменные, на которые ссылается выражение лямбда, должны быть окончательными или эффективными окончательными
Переменная считается эффективной окончательной, если она не изменяется после инициализации в локальном блоке. Это означает, что теперь вы можете использовать локальную переменную без конечного ключевого слова внутри анонимного класса или выражения лямбда, если они должны быть окончательно окончательными.
Если вы не хотите объявлять эффективную окончательную конечную переменную, эта новая функция поможет вам, если вы используете лямбда-выражения/анонимные классы. Вы можете избежать объявления ключевого слова final
для переменных effective final
. Посмотрите на статью
Ответ 9
Истинно, что конечная переменная используется так, что никто не может изменить значение, она работает как константа в java.
Позвольте мне привести пример
Я создал один пакет, который может быть использован и другим человеком, теперь есть некоторые переменные конфигурации, которые необходимо установить для правильной работы. скажем, свой логин. Таким образом, может быть несколько вариантов шифрования, таких как
encryption_method = HASH_ENCRYPTION
ИЛИ
encryption_method = SYMMETRIC_ENCRYPTION
вместо того, чтобы передавать целое число 1, 2, 3, мы можем определить конечную переменную, которая помогает разработчику в более читаемой форме и в источнике i, я не хочу, чтобы пользователь менял его, поэтому я держу его окончательным, иначе внутренняя логика может сломаться