Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: immutable class, mutable fields, defensive copy, Java

Как работать с mutable полями внутри immutable класса?

Вопрос проверяет понимание принципов иммутабельности в Java и способов работы с изменяемыми полями внутри неизменяемых классов.

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

Иммутабельный класс не должен изменять своё состояние после создания. Для работы с mutable полями, такими как Date или List, необходимо создавать защитные копии (defensive copy) при инициализации и в геттерах. Это гарантирует, что внешний код не сможет изменить внутреннее состояние объекта.

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

Проблема mutable полей в immutable классах

Иммутабельный класс — это класс, экземпляры которого не могут быть изменены после создания. Однако, если класс содержит поля, которые сами по себе являются изменяемыми (mutable), например, java.util.Date или List, то простое объявление их как final не гарантирует неизменность. Внешний код может получить ссылку на такой объект и изменить его содержимое, нарушив контракт иммутабельности.

Решение: защитные копии (Defensive Copy)

Для обеспечения истинной иммутабельности необходимо создавать копии mutable объектов при каждом доступе к ним. Это делается в двух местах:

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

Пример кода

import java.util.Date;

public final class ImmutablePerson {
    private final String name;
    private final Date birthDate;

    public ImmutablePerson(String name, Date birthDate) {
        this.name = name;
        // Защитная копия в конструкторе
        this.birthDate = new Date(birthDate.getTime());
    }

    public String getName() {
        return name;
    }

    public Date getBirthDate() {
        // Защитная копия в геттере
        return new Date(birthDate.getTime());
    }
}

Применение и вывод

Иммутабельные классы широко используются в многопоточных приложениях, так как они потокобезопасны без синхронизации. Также они упрощают отладку и предотвращают побочные эффекты. Защитные копии — это стандартный способ работы с mutable полями, но они могут снижать производительность из-за создания новых объектов. В таких случаях стоит рассмотреть использование неизменяемых аналогов, например, LocalDate вместо Date.

Вывод: Используйте защитные копии для mutable полей в immutable классах, чтобы гарантировать неизменность и потокобезопасность. Это особенно полезно в многопоточных средах и при работе с API, требующими неизменяемых объектов.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Java

    Java

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

#immutable class

#mutable fields

#defensive copy

#Java

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