С тех пор как я обнаружил силу final
ключевого слова в Java несколько лет назад, это помогло мне сделать мои коды более читабельными, поскольку люди могут легко видеть, что является переменными только для чтения. Он также может немного увеличить JIT, и, хотя он очень ограничен, он не может нанести вред, особенно при нацеливании на встраиваемые устройства, такие как платформы Android.
Но больше всего на свете это помогает сделать дизайн более устойчивым к изменениям и направлять других коммиттеров, когда им необходимо изменить базу кода.
Однако, просматривая некоторые исходные коды JDK, я никогда не сталкивался с этим ключевым словом ни для классов, ни для методов, ни для переменных. То же самое относится к различным системам, которые я должен был рассмотреть.
Есть ли причина? Это общая парадигма дизайна, позволяющая сделать все изменчивым изнутри?
final
полей имеет ту же семантику, что и записьvolatile
поля, а затем для их чтения необходимо иметь изменчивую семантику чтения, это не всегда то, что вы хотитеОтветы:
Я подозреваю, что причина, по которой вы этого не видите, заключается в том, что JDK предназначен для расширения (это основа, на которой строятся все ваши программы). Совсем не редкость, когда код приложения использует его. Я также не ожидал увидеть много этого в коде библиотеки (поскольку библиотеки часто также предназначены для расширения).
Попробуйте взглянуть на несколько хороших проектов с открытым исходным кодом, и я думаю, вы найдете больше.
В отличие от того, что вы видите в Java, в мире .NET, я много раз слышал аргумент, что предложения должны быть
sealed
(аналогично окончательному применению к классу) по умолчанию, и что разработчик должен явно отключить печать Это.источник
final
полей, а не методов. Неизменяемые классы также могут быть предназначены для расширения.Проблема с использованием
final
для передачи того, что что-то доступно только для чтения, заключается в том, что оно действительно работает только для примитивных типов, таких какint
иchar
т. Д. Все объекты в Java фактически упоминаются с использованием (своего рода) указателя. В результате, когда вы используетеfinal
ключевое слово для объекта, вы только говорите, что ссылка доступна только для чтения, сам объект по-прежнему изменчив.Он мог бы быть использован больше, если бы действительно делал объект доступным только для чтения. В C ++ это именно то, что
const
делает, и в результате это гораздо более полезное и интенсивно используемое ключевое слово.Одним из мест, где я
final
часто использую ключевое слово, являются параметры, чтобы избежать путаницы, создаваемой такими вещами:В этом примере кажется очевидным, почему это не работает, но если
someMethod(FancyObject)
это большое и сложное замешательство, может последовать. Почему бы не избежать этого?Это также часть стандартов кодирования Sun (или Oracle, я думаю, сейчас).
источник
final
в классах API Java, большинство объектов было бы неизменным, как и во многих библиотеках Scala. Тогда создание полей объектаfinal
делает класс неизменным во многих случаях. Этот дизайн уже используется вBigDecimal
иString
.Я согласен, что
final
ключевое слово улучшает читабельность. Это намного легче понять, когда объект неизменен. Однако в Java это очень многословно, особенно (на мой взгляд) при использовании параметров. Это не означает, что люди не должны использовать это, потому что это многословно, скорее они не используют это, потому что это многословно.Некоторые другие языки, такие как scala, значительно упрощают создание окончательных объявлений ( val ). В этих языках окончательные объявления могут быть более распространенными, чем переменные.
Обратите внимание, что существует много разных вариантов использования ключевого слова final. Ваш пост в основном охватывает пункты 2 и 3.
источник
Начнем с того, что официальные соглашения по Java Code не поддерживают и не запрещают конкретное использование
final
. То есть разработчики JDK могут свободно выбирать способ, который они предпочитают.Я не могу читать их мысли, но для меня предпочтение в том, использовать
final
или нет, было предметом внимания. Вопрос в том, достаточно ли у меня времени, чтобы полностью сосредоточиться на коде или нет .final
как мусора, который просто затемняет вещи, которые уже достаточно четко выражены в коде. Похоже, что разработчики JDK тоже попадают в эту категорию.С другой стороны, это было совершенно противоположно в другом проекте, где мы потратили в среднем час на 100 строк кода. Там я обнаружил, что стреляю
final
как из автомата в своем и чужом коде - просто потому, что это был самый быстрый способ обнаружить намерение парня, который написал это до меня, и, аналогично, самый быстрый способ сообщить о своем намерении парень, который будет работать над моим кодом позже.Рассуждения, как указано выше, скользкие. Преждевременная оптимизация может нанести вред; Дональд Кнут заходит так далеко, что называет его «корнем всего зла» . Не позволяйте этому заманить вас в ловушку. Напиши тупой код .
источник
Недавно я обнаружил радость функции «Сохранить действия» в Eclipse IDE. Я могу заставить его переформатировать мой код, вставить недостающие
@Override
аннотации и сделать некоторые изящные вещи, такие как удаление ненужных скобок в выражениях илиfinal
автоматическое размещение ключевых слов везде при каждом нажатииctrl + S
. Я активировал некоторые из этих триггеров, и, мальчик, это очень помогает!Оказалось, что многие из этих триггеров действуют как быстрая проверка работоспособности моего кода.
ctrl + s
? - возможно, я где-то облажался типов параметров!final
. Есть ли у изменить его значение?Оказалось, что чем меньше переменные меняются, тем меньше у меня проблем во время отладки. Сколько раз вы следили за значением некоторой переменной только для того, чтобы обнаружить, что она каким-то образом меняется, скажем, с 5 на 7? "Как, черт возьми, это может быть ?!" Вы спрашиваете себя и тратите следующие пару часов, входя и выходя из бесчисленных методов, чтобы выяснить, что вы допустили ошибку в своей логике. И чтобы исправить это, вам нужно добавить еще один флаг, пару условий и тщательно изменить некоторые значения здесь и там.
О, я ненавижу отладку! Каждый раз, когда я запускаю отладчик, я чувствую, что мое время истекает, и мне отчаянно нужно это время, чтобы хотя бы некоторые мои детские мечты сбылись! К черту отладку!
final
Означает, что больше нет таинственных изменений стоимости. Большеfinal
s => меньше надуманных частей в моем коде => меньше ошибок => больше времени, чтобы делать хорошие вещи!Что касается
final
классов и методов, мне все равно. Я люблю полиморфизм. Полиморфизм означает, что повторное использование означает, что меньше кода означает меньше ошибок. В любом случае JVM неплохо справляется с девиртуализацией и встраиванием методов, поэтому я не вижу смысла в том, чтобы убивать возможности повторного использования кода для получения неэффективных преимуществ в плане производительности.final
На первый взгляд, все эти элементы в коде несколько отвлекают и требуют времени, чтобы привыкнуть. Некоторые из моих товарищей по команде все еще очень удивляются, увидев так многоfinal
ключевых слов. Хотелось бы, чтобы в IDE была настройка для специальной окраски синтаксиса. Я был бы рад переключить его на какой-нибудь оттенок серого (например, аннотации), чтобы они не отвлекали внимание при чтении кода. Eclipse в настоящее время имеет отдельный цвет дляreturn
всех других ключевых слов, но не дляfinal
.источник
do
системой обозначений можно сделать все возможное :) Конечно, Java не лучший язык для написания в функциональном стиле, но, по крайней мере, он позволяет вам писать надежный код - и это то, что меня действительно волнует.