Чтобы сделать его действительно неизменным, вам нужно инициализировать элементы во время строительства.
Один из способов (и я не говорю, что это красиво!) Сделать это и избежать огромного списка параметров в конструкторе - это иметь изменяемый тип с такими же свойствами. Задайте свойства изменяемого типа по одному через «установщики», затем передайте изменяемый объект конструктору неизменяемого типа в качестве единственного аргумента. Затем неизменный объект копирует свойства из изменяемого источника в свои собственные (final
) члены.
Вы также можете рассмотреть «эффективную неизменность». То есть, несмотря на то, что неизменность не обеспечивается системой, вы используете методы кодирования, которые четко отделяют фазу инициализации от фазы использования. Ведь неизменяемость не требуется для сериализации.
Вы можете сделать еще один шаг, создав оболочку, скрывающую реализацию, для интерфейса, который не раскрывает свойства реализации. Оболочка реализует только методы в интерфейсе, делегируя «реальную» реализацию. Установщики и получатели из реализации отсутствуют в оболочке. Это предотвратит простое приведение клиентов от интерфейса к классу реализации и манипулирование свойствами.