Что такое immutable (неизменяемые) классы в Java?

«Что такое immutable (неизменяемые) классы в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Immutable класс — это класс, состояние которого невозможно изменить после создания объекта. Все поля финализированы, сеттеры отсутствуют, а методы не модифицируют внутреннее состояние.

Признаки immutable класса:

  1. Все поля объявлены как final
  2. Класс объявлен как final (запрещает наследование)
  3. Отсутствуют сеттеры (setter methods)
  4. Поля инициализируются только в конструкторе
  5. Методы не изменяют состояние объекта, а возвращают новые экземпляры
  6. Защита от изменения mutable объектов (если они есть в полях)

Пример реализации:

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;
        // Защитная копия для mutable поля
        this.hobbies = new ArrayList<>(hobbies);
    }

    public String getName() { return name; }
    public int getAge() { return age; }

    // Возвращаем защитную копию, а не оригинальный список
    public List<String> getHobbies() {
        return new ArrayList<>(hobbies);
    }

    // Метод для "изменения" возвращает новый объект
    public ImmutablePerson withAge(int newAge) {
        return new ImmutablePerson(this.name, newAge, this.hobbies);
    }
}

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

  • Потокобезопасность — объекты можно безопасно использовать в многопоточных средах без синхронизации
  • Простота тестирования — состояние объекта предсказуемо
  • Безопасное кэширование — объекты можно кэшировать, так как они не изменятся
  • Упрощённый код — отсутствуют побочные эффекты от изменения состояния

Типичные примеры в Java: String, Integer, LocalDate, BigDecimal