Task Livecoding Java Make Class Immutable

90. Как сделать класс immutable #

Условие задачи:
📌 Дан класс A с полями Integer a и List<Object> b.
Нужно сделать этот класс immutable — неизменяемым.

Код:

class A {
    Integer a;
    List<Object> b;
}
Спойлеры к решению
Подсказки
💡 Все поля должны быть private final.
💡 Никаких сеттеров.
💡 Значения должны устанавливаться только через конструктор.
💡 Коллекции — самое важное: их нужно копировать, иначе объект можно будет изменить снаружи.
💡 При возврате коллекции — отдавать неизменяемую копию (Collections.unmodifiableList).
Решение
public final class A {

    private final Integer a;
    private final List<Object> b;

    public A(Integer a, List<Object> b) {
        this.a = a;
        // глубокая копия списка + делаем его неизменяемым
        this.b = b == null 
                ? List.of() 
                : List.copyOf(b);
    }

    public Integer getA() {
        return a;
    }

    public List<Object> getB() {
        // возвращаем неизменяемый список
        return b;
    }
}

Почему этот класс immutable:

  • final class — от него нельзя унаследоваться и изменить поведение.

  • Поля private final — их невозможно изменить после создания.

  • Нет сеттеров.

  • Коллекция b копируется (List.copyOf) → исходный список вне объекта не влияет на состояние.

  • List.copyOf возвращает неизменяемый список, значит нельзя сделать getB().add(...).

Такой объект полностью неизменяем и безопасен для многопоточного использования.