Зачем отмечать локальные переменные и параметры метода как «final» в Java?

В Java вы можете квалифицировать локальные переменные и параметры метода с ключевым словом final.

public static void foo(final int x) { final String qwerty = "bar"; } 

Это приводит к невозможности переназначить x и qwerty в теле метода.

Эта практика подталкивает ваш код в направлении неизменности, который обычно считается плюсом. Но он также имеет тенденцию загромождать код с «окончательным» появлением повсюду. Как вы оцениваете конечное ключевое слово для локальных переменных и параметров метода в Java?

Вы должны стараться делать это, когда это уместно. Кроме того, чтобы предупредить вас, когда вы «случайно» пытаетесь изменить значение, он предоставляет информацию компилятору, который может привести к лучшей оптимизации файла classа. Это один из пунктов в книге «Hardcore Java» Роберта Симмонса-младшего. Фактически, книга посвящает всю свою вторую главу об использовании финала для продвижения оптимизации и предотвращения логических ошибок. По этой причине инструменты статического анализа, такие как PMD и встроенный SA Eclipse, обозначают эти случаи.

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

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

Но, конечно, это все личные предпочтения 😉

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

Следовательно, не используя final делает ваш код менее удобочитаемым и поддерживаемым, сам по себе 🙂

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

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

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

Я использую final только в ситуациях, где это необходимо (например, передавая значения анонимным classам).

Из-за (иногда) запутывающей природы поведения Java « pass by reference » я определенно согласен с окончательной доработкой параметра var.

Завершение локального варвара, похоже, несколько завышено ИМО.

Да, сделай это.

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

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

у финала есть три веские причины:

  • переменные экземпляра, заданные конструктором, становятся неизменными
  • методы, которые нельзя переопределить, становятся окончательными, используйте это по настоящим причинам, а не по умолчанию
  • локальные переменные или параметры, которые будут использоваться в анонимных classах внутри метода, должны быть окончательными

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

Хотя это создает небольшой беспорядок, стоит положить final . Ид, например, eclipse, может автоматически поставить final если вы его настроите.

Создание final значений локальных переменных и параметров важно, если вы хотите передать эти параметры в анонимные classы – например, вы создаете анонимный stream и хотите получить доступ к этим параметрам в теле метода run ().

Кроме того, я не уверен в преимуществах производительности, повышая производительность благодаря оптимизации компилятора. Это зависит от конкретной реализации компилятора, хочет ли он вообще оптимизировать ее …

Будет полезно узнать о любых характеристиках производительности от использования final

Зачем вам это нужно? Вы написали метод, поэтому любой, кто его модифицировал, всегда мог удалить последнее ключевое слово из qwerty и переназначить его. Что касается сигнатуры метода, те же рассуждения, хотя я не уверен, что это будет делать с подclassами вашего classа … они могут наследовать конечный параметр и даже если они переопределяют этот метод, не смогут де-финализировать x. Попробуйте и выясните, будет ли это работать.

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

редактировать

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

Я позволяю Eclipse делать это для меня, когда они используются в анонимном classе, что увеличивается благодаря использованию API Google Collection.

Мы делаем это здесь для локальных переменных, если считаем, что они не будут переназначены или не должны быть переназначены.

Параметры не являются окончательными, так как у нас есть Checkstyle-Check, который проверяет переназначение параметров. Конечно, никто никогда не захочет переназначить переменную параметра.

  • Обработка исключений службы REST для Spring Boot
  • Зачем использовать ReentrantLock, если вы можете использовать синхронизированный (это)?
  • Импорт PEM в хранилище ключей Java
  • Будет ли Java встроенный метод (ы) во время оптимизации?
  • java swingworker thread для обновления основного Gui
  • Как работает java auto boxing / unboxing?
  • Почему Stream не реализует Iterable ?
  • Как подсчитать количество вхождений элемента в список
  • Получение IP-адреса клиента
  • java.lang.IllegalArgumentException: метод сравнения нарушает общий контракт
  • Как получить доступ к частным методам и частным данным через reflection?
  • Interesting Posts

    Службы Google Play устарели. Требуется 3159100, но найдено 3158130

    Запланированное и повторяющееся письмо в Outlook?

    IllegalStateException: PagerAdapter приложения изменил содержимое адаптера без вызова PagerAdapter # notifyDataSetChanged

    Как сигнализировать select () для немедленного возврата?

    Как настроить платформу тестирования Google C ++ (gtest) на Visual Studio 2005

    Java: Самый эффективный метод для итерации по всем элементам в org.w3c.dom.Document?

    Сообщение об ошибке «Невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации. ‘

    Как извлечь список служб Windows и их статус в текстовый файл?

    Как получить поддержку AVX в QEMU?

    Excel. Предотвращение переполнения текста ячейки в следующую (пустую) ячейку.

    Редактирование Info.plist возможно программно?

    Простой mdadm RAID 1, не активирующий запасной

    Шлюз по умолчанию – 192.168.1.1, но не имеет доступа к нему с браузером

    Как оживить UIBezierPath

    Windows видит измененный размер FAT32 как RAW

    Давайте будем гением компьютера.