Вы часто читаете об неизменяемых объектах, требующих, чтобы конечные поля были неизменяемыми в Java. Так ли это на самом деле, или достаточно просто не иметь публичной изменчивости и не изменять ее состояние?
Например, если у вас есть неизменяемый объект, построенный по шаблону построителя, вы можете сделать это, заставив строителя назначить отдельные поля при его построении, или заставив строителя самостоятельно удерживать поля и в конечном итоге вернуть неизменный объект, передав значения к его (частному) конструктору.
Наличие полей final имеет очевидное преимущество - предотвращать ошибки реализации (например, разрешать коду сохранять ссылку на построитель и «строить» объект несколько раз, фактически изменяя существующий объект), но при этом Builder сохраняет его данные внутри объекта в том виде, в котором они построены, выглядят как СУШКА.
Таким образом, вопрос заключается в следующем: если предположить, что Builder не утечет Объект рано и не прекратит изменять объект после его создания (скажем, установив ссылку на объект как нулевое), действительно ли что-то получено (например, улучшена безопасность потока) в «неизменности» объекта, если поля объекта были сделаны окончательными вместо этого?