Рубрики
Без рубрики

маркировка параметров и локальных переменных как окончательных

В нескольких проектах на работе все объявлено окончательным. Даже параметры и локальные переменные. Я верю… Помеченный java.

В нескольких проектах на работе все объявлено окончательным. Даже параметры и локальные переменные. Я полагаю, что это делается с помощью настройки в intellij.

Это кажется чрезмерным, поэтому я хотел найти руководство по стилю, которое оправдывало бы этот стиль. Я не смог найти ни одного. На самом деле, очень немногие гиды упоминают этот стиль в положительном ключе. Существует руководство для jdk , в котором описаны некоторые редкие случаи, когда применяется этот стиль.

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

Мотивация

Написание модификаторов там, где они являются неявными, загромождает код, а узнать, какие модификаторы являются неявными, где это легко. Хотя параметры метода обычно не должны изменяться, последовательная пометка всех параметров в каждом методе как окончательных является преувеличением. Создание неизменяемых полей там, где это возможно, является хорошей практикой программирования. Подробности см. в разделе Эффективная Java, пункт 15: Минимизация изменчивости.

В руководстве по стилю Google не упоминается использование final для параметров и локальных переменных.

В руководстве по стилю twitter прямо не упоминается использование final для локальных переменных или параметров, но в примерах используется final только для полей.

Соглашения Oracle о кодировании не упоминают о том, чтобы сделать параметры или локальные переменные окончательными.

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

До java 8 локальные переменные должны были быть объявлены final при использовании в анонимном внутреннем классе. Это было изменено в java 8 с концепцией эффективных конечных переменных. Начиная с java 8, фактически конечные переменные не нужно помечать как конечные. Это объясняется в Спецификации языка Java .

Любая локальная переменная, формальный параметр или параметр исключения, используемые, но не объявленные во внутреннем классе, должны быть либо объявлены final, либо фактически final (§4.12.4), иначе при попытке использования возникает ошибка во время компиляции.

В нем также объясняется, что модификатор final может быть удален из кода, который объявляет параметры и локальные переменные как final.

Если переменная фактически является окончательной, добавление модификатора final к ее объявлению не приведет к возникновению каких-либо ошибок во время компиляции. И наоборот, локальная переменная или параметр, объявленные final в допустимой программе, становятся фактически final, если удалить модификатор final.

Я полагаю, что именно здесь применимо предложение из первого руководства по стилю. Параметры и локальные переменные должны быть объявлены окончательными только для улучшения удобочитаемости или для документирования проектного решения. Они не должны быть объявлены окончательными, чтобы “установить флажок” в отчете о статическом анализе кода.

Оригинал: “https://dev.to/moaxcp/marking-parameters-and-local-variables-as-final-2i4e”