Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: immutability, defensive copy, mutable object

Как обеспечить неизменяемость объекта с изменяемыми полями (например, Date)?

Вопрос проверяет умение проектировать неизменяемые объекты и защищаться от побочных изменений состояния.

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

Неизменяемость достигается за счет запрета изменения внутреннего состояния. Для изменяемых полей используется защитное копирование. Объект не должен предоставлять сеттеры. При доступе к полям возвращаются копии, а не оригиналы. Это предотвращает внешнее влияние на состояние объекта.

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

Некоторые типы, например Date, являются изменяемыми, но их можно безопасно использовать внутри неизменяемых объектов.

Основные принципы неизменяемости

Неизменяемый объект:

  • не имеет сеттеров

  • все поля final

  • состояние задается только в конструкторе

Но этого недостаточно для изменяемых полей.

Защитное копирование

Защитное копирование — это создание копии изменяемого объекта при:

  • присваивании

  • возврате наружу

Пример:

class User {
    private final Date birthDate;

    public User(Date birthDate) {
        this.birthDate = new Date(birthDate.getTime());
    }

    public Date getBirthDate() {
        return new Date(birthDate.getTime());
    }
}

В этом примере:

  • внешние изменения Date не влияют на объект

  • внутреннее состояние защищено

Альтернативные подходы

  • использовать неизменяемые типы (LocalDate)

  • оборачивать коллекции в unmodifiable

  • избегать передачи ссылок наружу

Почему это важно

Без защитного копирования:

  • объект формально выглядит неизменяемым

  • но его состояние можно изменить извне

  • контракт неизменяемости нарушается

Вывод: неизменяемость достигается не запретом сеттеров, а контролем доступа к изменяемым данным.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Java

    Java

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

#immutability

#defensive copy

#mutable object

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