Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: immutable, class, final, encapsulation, defensive copy

Как сделать класс immutable?

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

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

Неизменяемый (immutable) класс — это класс, состояние которого нельзя изменить после создания объекта. Для этого все поля должны быть объявлены как final и private, а класс — как final, чтобы его нельзя было наследовать. Конструктор должен инициализировать все поля, и не должно быть сеттеров. Если класс содержит изменяемые объекты (например, коллекции), необходимо возвращать их защищённые копии (defensive copies) в геттерах и не сохранять ссылки на внешние изменяемые объекты, переданные в конструктор.

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

Иммутабельный класс — это класс, экземпляры которого не могут изменять своё внутреннее состояние после создания. Это ключевая концепция для написания потокобезопасного, предсказуемого и простого для отладки кода, так как объект гарантированно остаётся в одном и том же состоянии на протяжении всего жизненного цикла.

Основные правила создания immutable класса

  • Объявите класс как final, чтобы предотвратить наследование и переопределение методов.
  • Объявите все поля как private и final, чтобы они могли быть инициализированы только в конструкторе.
  • Не предоставляйте сеттеров (setter methods) для изменения полей.
  • Если класс содержит ссылки на изменяемые объекты (например, коллекции, массивы, другие не-final классы), необходимо обеспечить глубокую защиту:
    • В конструкторе создавайте копии переданных извне изменяемых объектов, а не сохраняйте ссылки на них.
    • В геттерах, возвращающих такие объекты, возвращайте их копии (defensive copy), а не оригинальные ссылки.

Пример на Java

import java.util.*;

public final class ImmutablePerson {
    private final String name;
    private final int age;
    private final List hobbies;

    // Конструктор с защитным копированием
    public ImmutablePerson(String name, int age, List hobbies) {
        this.name = name;
        this.age = age;
        // Создаём копию переданного списка
        this.hobbies = new ArrayList<>(hobbies);
    }

    // Геттеры
    public String getName() { return name; }
    public int getAge() { return age; }
    // Возвращаем копию списка, а не оригинал
    public List getHobbies() {
        return new ArrayList<>(hobbies);
    }
}

В этом примере даже если внешний код изменит исходный список hobbies, переданный в конструктор, или получит список через геттер, внутреннее состояние объекта ImmutablePerson останется неизменным.

Где применяются immutable классы

Иммутабельные объекты широко используются в многопоточном программировании, так как они по своей природе потокобезопасны (не требуют синхронизации). Они являются идеальными кандидатами для ключей в HashMap или элементов в Set, так как их хэш-код не меняется. Также они часто применяются в функциональном программировании и в качестве DTO (Data Transfer Objects) для передачи данных между слоями приложения.

Вывод: Создавайте immutable классы, когда вам нужны объекты с постоянным, надёжным состоянием, особенно в многопоточной среде, для ключей коллекций или для упрощения логики программы за счёт отсутствия побочных эффектов.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Java

    Java

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

#immutable

#class

#final

#encapsulation

#defensive copy

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