90. Как сделать класс immutable #
Условие задачи:
📌 Дан класс A с полями Integer a и List<Object> b.
Нужно сделать этот класс immutable — неизменяемым.
Код:
class A {
Integer a;
List<Object> b;
}
Спойлеры к решению
Подсказки
💡 Все поля должны быть
💡 Никаких сеттеров.
💡 Значения должны устанавливаться только через конструктор.
💡 Коллекции — самое важное: их нужно копировать, иначе объект можно будет изменить снаружи.
💡 При возврате коллекции — отдавать неизменяемую копию (
private final.💡 Никаких сеттеров.
💡 Значения должны устанавливаться только через конструктор.
💡 Коллекции — самое важное: их нужно копировать, иначе объект можно будет изменить снаружи.
💡 При возврате коллекции — отдавать неизменяемую копию (
Collections.unmodifiableList).Решение
public final class A {
private final Integer a;
private final List<Object> b;
public A(Integer a, List<Object> b) {
this.a = a;
// глубокая копия списка + делаем его неизменяемым
this.b = b == null
? List.of()
: List.copyOf(b);
}
public Integer getA() {
return a;
}
public List<Object> getB() {
// возвращаем неизменяемый список
return b;
}
}
Почему этот класс immutable:
final class— от него нельзя унаследоваться и изменить поведение.Поля
private final— их невозможно изменить после создания.Нет сеттеров.
Коллекция
bкопируется (List.copyOf) → исходный список вне объекта не влияет на состояние.List.copyOfвозвращает неизменяемый список, значит нельзя сделатьgetB().add(...).
Такой объект полностью неизменяем и безопасен для многопоточного использования.