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