Может ли чрезмерное использование финального вреда больше, чем делать добро? - PullRequest
9 голосов
/ 10 февраля 2010

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

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

Ответы [ 8 ]

13 голосов
/ 10 февраля 2010
  1. Намерение. Другие люди, изменяющие ваш код, не будут изменять значения, которые они не должны изменять.

  2. Оптимизация компилятора может быть выполнена, если компилятор знает, что значение поля никогда не изменится.

Кроме того, если КАЖДАЯ переменная в классе является окончательной (как вы упоминаете в своем посте), то у вас есть неизменяемый класс (если вы не предоставляете ссылки на изменяемые свойства), что является отличным способом достижения потокобезопасность.

10 голосов
/ 10 февраля 2010

Недостатком является то, что

annoy it is hard
annoy to read
annoy code or anything
annoy else when it all 
annoy starts in the 
annoy same way

Помимо очевидного использования для создания констант и предотвращения подклассов / переопределений, в большинстве случаев это личное предпочтение, поскольку многие полагают, что преимущества «демонстрации намерений программиста» перевешиваются фактической читабельностью кода. Многие предпочитают немного меньше многословия.

Что касается оптимизаций, это плохая причина для его использования ( во многих случаях бессмысленно ). Это худшая форма микрооптимизации, и во времена JIT она не имеет смысла.

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

4 голосов
/ 10 февраля 2010

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

3 голосов
/ 10 февраля 2010

Одно преимущество для параллельного программирования, которое еще не было упомянуто:

Окончательные поля гарантированно будут инициализированы после завершения выполнения конструктора.

3 голосов
/ 10 февраля 2010

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

http://www.artima.com/intv/blochP.html

2 голосов
/ 10 февраля 2010

Проект, над которым я сейчас работаю, настроен так, что всякий раз, когда в Eclipse нажимается «сохранить», модификатор final добавляется к каждой переменной или полю, которые не изменяются в коде. И это еще никому не повредило.

1 голос
/ 10 февраля 2010

Есть много веских причин использовать final, как отмечалось в другом месте. ИМО, одно место, где оно того не стоит, - это параметры метода. Строго говоря, ключевое слово добавляет здесь значение, но оно недостаточно высокое, чтобы выдержать уродливый синтаксис. Я предпочел бы выразить такую ​​информацию через модульные тесты.

0 голосов
/ 10 февраля 2010

Я думаю, что использование окончательных значений over, которые являются внутренними для класса, является излишним, если класс, вероятно, не будет наследоваться. Единственное преимущество заключается в оптимизации компилятора, что, безусловно, может принести пользу.

...