Я final
все время использую для атрибутов объекта.
final
Ключевое слово имеет видимость семантику при использовании атрибутов объекта. По сути, установка значения атрибута final происходит до того, как конструктор вернется. Это означает, что до тех пор, пока вы не дадите this
ссылке покинуть конструктор и будете использовать ее final
для всех своих атрибутов, ваш объект (в соответствии с семантикой Java 5) гарантированно будет правильно сконструирован, и, поскольку он также неизменен, его можно безопасно публиковать в другие темы.
Неизменяемые объекты - это не только безопасность потоков. Они также значительно упрощают рассуждения о переходах состояний в вашей программе, потому что пространство того, что может измениться, является преднамеренным и, если используется последовательно, полностью ограничено только теми вещами, которые должны измениться.
Я иногда тоже делаю методы окончательными, но не так часто. Я редко делаю уроки окончательными. Я обычно делаю это, потому что мне мало нужно. Я, как правило, мало пользуюсь наследованием. Вместо этого я предпочитаю использовать интерфейсы и композицию объектов - это также поддается дизайну, который, как мне кажется, часто проще тестировать. Когда вы кодируете интерфейсы, а не конкретные классы, вам не нужно использовать наследование при тестировании, как это происходит с такими фреймворками, как jMock, гораздо проще создавать mock-объекты с интерфейсами, чем с конкретными классами.
Я думаю, что я должен сделать большинство своих уроков окончательными, но я просто еще не вошел в привычку.