Что такое иммутабельный объект в Java? Приведите пример его реализации.

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

Ответ

Иммутабельный (неизменяемый) объект — это объект, состояние которого нельзя изменить после создания. Это фундаментальная концепция для написания потокобезопасного и предсказуемого кода.

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

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

// 1. Класс объявлен как final
public final class ImmutablePerson {
    // 2. Все поля private и final
    private final String name;
    private final int age;
    private final List<String> hobbies; // Изменяемый объект внутри

    // 3. Все данные инициализируются в конструкторе
    public ImmutablePerson(String name, int age, List<String> hobbies) {
        this.name = name;
        this.age = age;
        // 4. Создаем защитную копию для изменяемых полей
        this.hobbies = new ArrayList<>(hobbies);
    }

    // 5. Только геттеры, без сеттеров
    public String getName() { return name; }
    public int getAge() { return age; }
    // 6. Геттер для коллекции возвращает неизменяемое представление
    public List<String> getHobbies() {
        return Collections.unmodifiableList(hobbies);
    }
}

Ключевые принципы:

  1. final класс — запрещает наследование и переопределение методов.
  2. final поля — гарантируют однократную инициализацию.
  3. Нет сеттеров — отсутствует публичный API для модификации.
  4. Защитное копирование — в конструкторе и геттерах для изменяемых внутренних объектов (массивы, коллекции).
  5. Возврат неизменяемых представлений — например, через Collections.unmodifiableList().

Преимущества: потокобезопасность без синхронизации, простота кэширования и отладки, безопасное использование в качестве ключей HashMap.