Чтобы создать неизменяемый класс в Java, объяви класс с модификатором final. Это предотвратит наследование и создание подклассов, что иначе могло бы позволить изменить его поведение.
Сделай все поля private, чтобы предотвратить прямой внешний доступ. Кроме того, объяви все поля как final, чтобы они могли быть присвоены только один раз во время инициализации. Это гарантирует, что значения полей не могут быть изменены после создания объекта.
Используй глубокое копирование при инициализации полей через конструктор. Это особенно важно для изменяемых объектов (таких как коллекции или массивы). Глубокое копирование гарантирует, что внешние изменения исходных объектов не повлияют на неизменяемый экземпляр.
Пример подхода:
private final List<String> items;
public ImmutableClass(List<String> items) {
this.items = new ArrayList<>(items); // глубокое копирование
}
Предоставь только геттеры для доступа к значениям полей. Никогда не реализуй сеттеры, так как они позволили бы изменять объект после создания. Для изменяемых возвращаемых типов возвращай защитные копии вместо прямых ссылок.
Если реализуешь метод clone(), возвращай копию объекта вместо ссылки на сам объект. Это предотвратит получение и изменение внутреннего состояния внешним кодом.
Следуя этим практикам, ты гарантируешь, что твой класс действительно неизменяемый, обеспечивая:
Объявление класса как final в Java предотвращает расширение класса подклассами, что необходимо, потому что подкласс может переопределить методы и нарушить неизменяемость родительского класса.
Новый — ещё не проверен сообществом
Вы