← Назад к вопросам

В чем разница между 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] - изменилась!

Ключевое отличие

АспектImmutableUnmodifiable
ГарантияОбъект не может быть изменёнЗапрещены методы изменения, но базовый объект может измениться
ДизайнВстроено в классЭто обёртка
ПотокобезопасностьДаНет
ИспользованиеString, Integer, LocalDateРезультаты Collections.unmodifiable*
В Java 9+List.of(), Set.of(), Map.of()Collections.unmodifiableList()

Когда использовать

  • Immutable: когда нужна полная гарантия неизменяемости и потокобезопасность
  • Unmodifiable: когда нужно просто запретить случайное изменение через интерфейс

В современной Java (9+) предпочитают List.of(), которые создают истинно неизменяемые коллекции, а не unmodifiable wrappers.