Я использую шаблон public-final-field (anti?) Для домашних проектов для классов, которые в основном представляют собой неизменную структуру данных с конструктором, наряду с абсолютными основами, такими как equals (), hashCode (), toString () и т. Д. . если необходимо. (Я избегаю слова «структура» из-за различных его толкований).
Я бы не стал применять этот подход к чужой кодовой базе (работа, общедоступный проект и т. Д.), Потому что он, скорее всего, будет несовместим с другим кодом, и принципы, такие как When In Rome или Least Surprise, имеют приоритет.
Тем не менее, что касается ответов Даниэля С. Собрала и aioobe, я отношусь к тому, что если дизайн класса становится проблемой из-за непредвиденных событий, в IDE будет работать 30 секунд, чтобы приватизировать поля и добавить средства доступа, и не более 5 или 10 минут, чтобы исправить испорченные ссылки, если их нет сотен. Все, что в результате проваливается, в первую очередь проходит модульное тестирование. :-)
[Редактировать: Эффективная Java довольно решительно против этой идеи, при этом отмечая, что она «менее вредна» для неизменных полей.]