Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: immutable class, defensive copy, unmodifiable collection, getter, Java

Что делать с коллекциями в immutable классе при возврате через getter?

Проверяет понимание принципов неизменяемости (immutability) в Java и правильного возврата коллекций из immutable класса.

Короткий ответ

В immutable классе при возврате коллекции через getter нельзя отдавать прямую ссылку на внутреннее поле, иначе внешний код сможет её изменить. Нужно возвращать либо неизменяемую обёртку (Collections.unmodifiableList), либо защитную копию (new ArrayList<>(list)). Это гарантирует, что состояние объекта останется неизменным после его создания.

Длинный ответ

Проблема возврата коллекций из immutable класса

Immutable (неизменяемый) класс — это класс, экземпляр которого нельзя изменить после создания. Все поля такого класса должны быть final, а сам класс — объявлен как final или иметь приватные конструкторы. Однако просто сделать поле коллекции final недостаточно: если getter возвращает прямую ссылку на этот список, внешний код может вызвать list.add(...) и изменить внутреннее состояние объекта.

Как правильно возвращать коллекции

Есть два основных подхода:

  • Неизменяемая обёртка (unmodifiable view) — возвращается через Collections.unmodifiableList(list). Любая попытка изменить такую коллекцию вызовет UnsupportedOperationException.
  • Защитная копия (defensive copy) — возвращается новый список, например new ArrayList<>(list). Это гарантирует, что изменения внешней копии не затронут внутренние данные.

Пример кода

public final class ImmutablePerson {
    private final String name;
    private final List<String> hobbies;

    public ImmutablePerson(String name, List<String> hobbies) {
        this.name = name;
        // Защитная копия на входе
        this.hobbies = new ArrayList<>(hobbies);
    }

    public String getName() {
        return name;
    }

    public List<String> getHobbies() {
        // Возвращаем неизменяемую обёртку
        return Collections.unmodifiableList(hobbies);
    }
}

Вывод

При возврате коллекций из immutable класса всегда используйте либо неизменяемую обёртку, либо защитную копию. Это сохраняет контракт неизменяемости и предотвращает случайное или намеренное изменение внутреннего состояния объекта.

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • Java

    Java

Ключевые слова

#immutable class

#defensive copy

#unmodifiable collection

#getter

#Java

Подпишись на Java Developer в телеграм