Я final
весь час використовую для атрибутів об'єкта.
final
Ключове слово має видимість семантику при використанні атрибутів об'єкта. В основному, встановлення значення кінцевого атрибута об'єкта відбувається, перш ніж конструктор повернеться. Це означає, що доки ви не дозволите, щоб this
посилання не виходила з конструктора, а ви використовували final
для всіх атрибутів, ваш об’єкт (під семантикою Java 5) гарантовано належним чином сконструйований, і оскільки він є незмінним, його можна безпечно опублікувати до інших ниток.
Незмінні об'єкти стосуються не лише безпеки потоку. Вони також значно полегшують міркування про переходи стану у вашій програмі, оскільки простір того, що можна змінити, є навмисно і, якщо використовувати їх послідовно, ретельно обмежується лише тим, що має змінитися.
Я іноді також роблю методи остаточними, але не так часто. Я рідко роблю заняття заключними. Я, як правило, роблю це, бо мені це мало потрібно. Я, як правило, мало використовую спадщину. Я вважаю за краще використовувати інтерфейси та композицію об’єктів - це також піддається дизайну, який, як я вважаю, часто простіше перевірити. Коли ви кодуєте інтерфейси замість конкретних класів, тоді вам не потрібно використовувати спадкування при тестуванні, як це буває, за допомогою фреймів, таких як jMock, набагато простіше створювати макет-об’єкти з інтерфейсами, ніж це з конкретними класами.
Напевно, я маю зробити більшість моїх занять остаточними, але я просто ще не потрапив у звичку.