Назад к вопросам
Junior
80
questionbank

Что такое неизменяемые объекты (immutable)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Объекты, состояние которых не может быть изменено после создания. При попытке модификации всегда создается новый объект.

Примеры неизменяемых классов в Java:

  • String
  • Примитивные обертки (Integer, Long, Boolean и т.д.)
  • Некоторые коллекции (Collections.unmodifiableList(), ImmutableList из Guava)

Преимущества:

  • Потокобезопасность (не требуют синхронизации при совместном доступе).
  • Простота в использовании (легко понять состояние объекта).
  • Могут использоваться как ключи в HashMap или элементы Set (их хеш-код и equals() не меняются).
  • Улучшают производительность за счет возможности кэширования и повторного использования.

Недостатки:

  • Создание нового объекта при каждой модификации может быть неэффективным для частых изменений.

Создание своих:

  • Объявить класс final.
  • Объявить все поля приватными и final.
  • Не предоставлять методов-сеттеров.
  • В геттерах для мутабельных полей возвращать копии, а не ссылки на оригинальные объекты.
public final class ImmutablePerson {
    private final String name;
    private final int age;
    private final List<String> hobbies;

    public ImmutablePerson(String name, int age, List<String> hobbies) {
        this.name = name;
        this.age = age;
        // Создаем копию, чтобы избежать изменения извне
        this.hobbies = new ArrayList<>(hobbies);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getHobbies() {
        // Возвращаем неизменяемую обертку
        return Collections.unmodifiableList(hobbies);
    }
}