Junior — Middle
189
Is het voldoende om de klasse als final te declareren, de velden als private te verbergen en geen setters te gebruiken om de ongewijzigdheid van het object na initialisatie te bereiken?
Antwoord van AI
sobes.tech AI
Объявление класса как final, скрытие полей под private и отказ от сеттеров — это важные шаги для создания неизменяемого объекта, но этого недостаточно для полной гарантии неизменяемости.
Чтобы объект был действительно неизменяемым после инициализации, нужно:
- Сделать все поля final (если это Java), чтобы их нельзя было изменить после присвоения.
- Если поля — это ссылки на изменяемые объекты (например, коллекции), нужно создавать их копии при инициализации и возвращать копии или неизменяемые представления, чтобы внешние изменения не влияли на внутреннее состояние.
- Отсутствие сеттеров предотвращает изменение полей извне.
- Класс final запрещает наследование, что исключает возможность изменения поведения через подклассы.
Пример:
public final class ImmutablePerson {
private final String name;
private final List<String> hobbies;
public ImmutablePerson(String name, List<String> hobbies) {
this.name = name;
this.hobbies = new ArrayList<>(hobbies); // копия списка
}
public String getName() {
return name;
}
public List<String> getHobbies() {
return Collections.unmodifiableList(hobbies); // возвращаем неизменяемый список
}
}
Таким образом, только объявление класса final и приватность полей без дополнительных мер не гарантируют полной неизменяемости.