Sobes.tech
Назад к вопросам
Junior — Middle
42

Могли бы вы объяснить, что такое объекты, которые нельзя изменить после создания?

Компании, где спрашивали
ОТП БанкОТП Банк

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

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать понимание immutability: объект после создания не меняет своё состояние. Важно отличать неизменяемость объекта от неизменяемости ссылки на него. Также полезно упомянуть плюсы: потокобезопасность, предсказуемость и удобство в работе с коллекциями и ключами.

Определение:

Неизменяемый объект — это объект, внутреннее состояние которого нельзя изменить после завершения создания. Если нужно «изменить» такой объект, создаётся новый экземпляр с нужными значениями. В Java это обычно означает отсутствие сеттеров, final-поля, а также защиту от изменения вложенных изменяемых объектов.

Пример использования:

public final class User {
    private final String name;
    private final int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public User withAge(int newAge) {
        return new User(this.name, newAge);
    }
}
User u1 = new User("Anna", 25);
User u2 = u1.withAge(26);

u1 остаётся прежним, а u2 — это новый объект с другим возрастом.

Пояснение кода:

  • Класс объявлен как final, чтобы его нельзя было наследовать и случайно нарушить неизменяемость.
  • Поля name и age объявлены как final и устанавливаются только в конструкторе.
  • Сеттеров нет, поэтому после создания изменить поля напрямую нельзя.
  • Метод withAge не меняет текущий объект, а создаёт новый с нужным значением.
  • Для сложных объектов внутри класса нужна дополнительная защита: копирование при передаче и возврате, чтобы не дать изменить внутреннее состояние через ссылки.

Ключевые моменты:

  • Неизменяемость означает, что состояние объекта не меняется после создания.
  • final у ссылки не делает объект неизменяемым, он лишь запрещает переназначение ссылки.
  • Иммутабельные объекты проще безопасно использовать в многопоточности.
  • Такие объекты удобны как ключи в HashMap, потому что их hashCode и equals не меняются.
  • При наличии изменяемых полей внутри нужна defensive copy, иначе объект формально перестаёт быть безопасно неизменяемым.
  • В Java типичные примеры — String, Integer и многие классы из java.time.