Когда нужно использовать финал для параметров метода и локальных переменных?

161
задан Hearen 21 March 2019 в 00:10
поделиться

11 ответов

Будьте зациклены:

  • поля Final - отмечающие поля, поскольку финал вынуждает их быть установленными к концу конструкции, делая ту неизменную ссылку поля. Это позволяет безопасную публикацию полей и может избежать потребности в синхронизации на более поздних чтениях. (Обратите внимание, что для ссылки на объект, только ссылка поля неизменна - вещи, к которым относится ссылка на объект, может все еще измениться, и это влияет на неизменность.)
  • Заключительные статические поля - Хотя я использую перечисления теперь для многих случаев, где я раньше использовал статические заключительные поля.

Рассматривают, но используют рассудительно:

  • Заключительные классы - дизайн Платформы/API является единственным случаем, где я рассматриваю его.
  • Последние методы - В основном то же как заключительные классы. Если Вы используете шаблонные шаблоны метода как сумасшедший и отмечаете финал материала, Вы, вероятно, полагаетесь слишком много на наследование и недостаточно на делегацию.

Игнорируют если анальное ощущение себя:

  • параметры Метода и локальные переменные - я РЕДКО делаю это в основном, потому что я ленив, и я нахожу, что это создает помехи коду. Я полностью признаю, что маркировка параметров и локальных переменных, которые я не собираюсь изменять, является "более правильной". Мне жаль, что это не было значение по умолчанию. Но это не, и я нахожу код более трудным понять с финалом на всем протяжении. Если я нахожусь в чужом коде, я не собираюсь вытаскивать их, но если я запишу новый код, то я не вставлю их. Одно исключение имеет место, где необходимо отметить что-то заключительное, таким образом, можно получить доступ к нему из анонимного внутреннего класса.
168
ответ дан Alex Miller 23 November 2019 в 21:26
поделиться

Если у Вас есть внутренние (анонимные) классы, и для метода нужно к переменной доступа содержания метода, у Вас должна быть та переменная как финал.

Кроме этого, то, что Вы сказали, правильно.

1
ответ дан Ether 23 November 2019 в 21:26
поделиться

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

1
ответ дан Sean 23 November 2019 в 21:26
поделиться

Не ясно из вопроса, очевидно ли это, но создание финала параметра метода влияет только на тело метода. Это делает НЕ , передают любую интересную информацию о намерениях метода к invoker. Объект, передаваемый в, может все еще быть видоизменен в рамках метода (финал не является consts), и объем переменной в рамках метода.

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

, Например, переменные, я сделал бы их окончательными, если они - логически константы.

2
ответ дан ykaganovich 23 November 2019 в 21:26
поделиться

Я буду использовать финал так, как я могу. Выполнение так отметит при неумышленном изменении поля. Я также параметры метода установки к финалу. Выполнение, таким образом, я поймал несколько ошибок от кода, который я принял, когда они пытаются 'установить' параметр, забывая передачи Java значением.

4
ответ дан Javamann 23 November 2019 в 21:26
поделиться

Если Вы пишете приложение, что кто-то должен будет считать код после, скажем, 1 год, то да, используйте финал на переменной, которая не должна быть изменена все время. Путем выполнения этого код будет более "самодокументировать", и Вы также уменьшаете шанс для других разработчиков сделать глупые вещи как использование локальной константы как локальная временная переменная.

, Если Вы пишете, некоторый холостой код, тогда, nah, не потрудился определять всю константу и делать их окончательными.

5
ответ дан Alvin 23 November 2019 в 21:26
поделиться

Ну, это все зависит от Вашего стиля..., если Вам НРАВИТСЯ видеть финал, когда Вы не будете изменять переменную, затем используйте его. Если Вам не НРАВИТСЯ видеть, что он... затем пропускает его.

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

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

Так, я сказал бы, просто выбирают направление, которое Вы склоняетесь к и просто идете с ним (безотносительно случая, попытайтесь быть последовательными).

<час>

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

6
ответ дан Mike Stone 23 November 2019 в 21:26
поделиться

Полезно в параметрах избежать, изменяют значение параметра случайно и представляют тонкую ошибку. Я использую для игнорирования этой рекомендации, но после пребывания в течение приблизительно 4 часов в ужасном методе (с сотнями строк кода и несколькими четверками, вложил IFS и весь вид плохих методов), я рекомендую Вам сделать это.

 public int processSomethingCritical( final int x, final int y ){
 // hundreds of lines here 
     // for loop here...
         int x2 = 0;
        x++; // bug aarrgg...
 // hundreds of lines there
 // if( x == 0 ) { ...

 }

, Конечно, в идеальном мире этого не произошло бы, но.. хорошо.. иногда необходимо поддерживать код других.: (

6
ответ дан OscarRyz 23 November 2019 в 21:26
поделиться

Я нашел параметры метода выделения и местных жителей, поскольку final полезно как помощь для рефакторинга, когда рассматриваемый метод является непостижимой путаницей несколько страниц длиной. Опрысните final подробно, посмотрите то, что "не может присвоить последней переменной" ошибки, которые подбрасывает компилятор (или Ваш IDE), и Вы просто могли бы обнаружить, почему переменная, названная "данными", заканчивается пустой указатель даже при том, что несколько, которые (устарели), комментарии клянутся, что этого не может произойти.

Тогда можно зафиксировать некоторые ошибки путем замены снова использованных переменных новыми переменными, объявленными ближе на грани использования. Тогда Вы находите, что можно обернуть целые части метода в обзоре фигурных скобок, и внезапно Вы - одно нажатие клавиши IDE далеко от "Метода Извлечения", и Ваш монстр просто стал более понятным.

, Если Ваш метод уже не неудобная в сопровождении авария, я предполагаю, что могло бы быть значение в создании финала материала, чтобы отговорить людей превращать его в упомянутую аварию; но если это - сокращенный метод (см.: весьма удобный в сопровождении), тогда Вы рискуете добавлять много многословия. В частности, подписи функции Java достаточно тверды вписаться в 80 символов, как это, не добавляя еще шесть на аргумент!

9
ответ дан Sam Stokes 23 November 2019 в 21:26
поделиться

Преимущества времени разработки "финала" являются, по крайней мере, столь же значительными как преимущества во время выполнения. Это говорит будущим редакторам кода что-то о Ваших намерениях.

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

отмечание переменного "финала" (и присвоение его в конструкторе) полезно с внедрением зависимости. Это указывает на природу "сотрудника" переменной.

отмечание метода "финал" полезно в абстрактных классах. Это ясно формирует рисунок, где точки расширения.

15
ответ дан Eric R. Rath 23 November 2019 в 21:26
поделиться

он что-то, что я должен приложить усилие, чтобы не забыть делать?

нет, если Вы используете Eclipse, потому что можно настроить Действие Сохранения для автоматического добавления этих финал модификаторы для Вас. Тогда Вы извлекаете пользу для меньшего усилия.

44
ответ дан Peter Hilton 23 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: