Что такое Immutable Class в Java?

«Что такое Immutable Class в Java?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Immutable Class (Неизменяемый класс) — это класс, экземпляры которого не могут быть изменены после создания. Их состояние фиксируется при конструировании.

Как создать неизменяемый класс:

  1. Объявите класс как final, чтобы запретить наследование.
  2. Объявите все поля как private и final.
  3. Инициализируйте все поля через конструктор.
  4. Не предоставляйте сеттеров (setter methods).
  5. Для полей-ссылок на изменяемые объекты:
    • Не предоставляйте методов, меняющих эти объекты.
    • В геттерах возвращайте глубокую копию или неизменяемое представление (например, Collections.unmodifiableList()).

Пример:

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);
    }
}

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

  • Потокобезопасность: Объекты можно свободно передавать между потоками без синхронизации.
  • Простота: Предсказуемое состояние, легче рассуждать о коде.
  • Безопасность кэширования и использования в качестве ключей HashMap.