← Назад к вопросам
В чем разница между Unmodifiable и Immutable?
2.0 Middle🔥 121 комментариев
#Коллекции#ООП#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между Unmodifiable и Immutable
Это два фундаментальных концепта в Java, которые часто путают, но они имеют совершенно разные семантику и гарантии.
Immutable (Неизменяемый)
Immmutable объект — это объект, который по своей природе не может быть изменён после создания. Его состояние полностью зафиксировано и никогда не изменится.
public final class ImmutableString {
private final String value;
public ImmutableString(String value) {
this.value = value;
}
public String getValue() {
return value;
}
// Нет сеттеров!
}
Характеристики Immutable:
- Класс помечен как
final(не может быть наследован) - Все поля
private final - Нет методов для изменения состояния
- Потокобезопасен по определению
- Можно кэшировать hashCode
- Безопасен для использования в HashMap/HashSet
Unmodifiable (Неизменяемый по интерфейсу)
Unmodifiable — это обёртка над изменяемым объектом, которая скрывает методы изменения, но не гарантирует, что базовый объект не изменится.
List<String> originalList = new ArrayList<>();
originalList.add("item");
List<String> unmodifiableList = Collections.unmodifiableList(originalList);
// unmodifiableList.add("item2"); // UnsupportedOperationException!
originalList.add("item2"); // Работает!
System.out.println(unmodifiableList); // [item, item2] - изменилась!
Характеристики Unmodifiable:
- Это обёртка (decorator pattern)
- Методы add/remove/set выбрасывают UnsupportedOperationException
- Базовая коллекция может быть изменена через исходную ссылку
- Не гарантирует потокобезопасность
- hashCode может измениться, если базовый объект изменился
Практическое сравнение
// Immutable пример
List<String> immutableList = List.of("a", "b", "c");
// immutableList.add("d"); // UnsupportedOperationException
// Никто не может изменить содержимое
// Unmodifiable пример
List<String> mutableList = new ArrayList<>(Arrays.asList("a", "b"));
List<String> unmod = Collections.unmodifiableList(mutableList);
// unmod.add("d"); // UnsupportedOperationException
mutableList.add("c"); // Работает!
System.out.println(unmod); // [a, b, c] - изменилась!
Ключевое отличие
| Аспект | Immutable | Unmodifiable |
|---|---|---|
| Гарантия | Объект не может быть изменён | Запрещены методы изменения, но базовый объект может измениться |
| Дизайн | Встроено в класс | Это обёртка |
| Потокобезопасность | Да | Нет |
| Использование | String, Integer, LocalDate | Результаты Collections.unmodifiable* |
| В Java 9+ | List.of(), Set.of(), Map.of() | Collections.unmodifiableList() |
Когда использовать
- Immutable: когда нужна полная гарантия неизменяемости и потокобезопасность
- Unmodifiable: когда нужно просто запретить случайное изменение через интерфейс
В современной Java (9+) предпочитают List.of(), которые создают истинно неизменяемые коллекции, а не unmodifiable wrappers.