← Назад ко всем вопросам

Как сделать класс иммутабельным

1️⃣ Как кратко ответить

Чтобы сделать класс иммутабельным, объявите все поля final, не предоставляйте сеттеры, инициализируйте поля в конструкторе, и не возвращайте изменяемые объекты напрямую из методов.

2️⃣ Подробное объяснение темы

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

Основные принципы создания иммутабельного класса:

  1. Сделайте класс final: Это предотвратит наследование и изменение поведения класса в подклассах.

    public final class ImmutableClass {
        // Поля и методы
    }
    
  2. Сделайте все поля private и final: Это гарантирует, что поля могут быть установлены только один раз и не могут быть изменены после инициализации.

    public final class ImmutableClass {
        private final int value;
        // Конструктор и методы
    }
    
  3. Инициализируйте поля в конструкторе: Все поля должны быть установлены в конструкторе, и после этого они не должны изменяться.

    public final class ImmutableClass {
        private final int value;
    ​
        public ImmutableClass(int value) {
            this.value = value;
        }
    }
    
  4. Не предоставляйте сеттеры: Исключите методы, которые могут изменить состояние объекта после его создания.

  5. Возвращайте копии изменяемых объектов: Если класс содержит изменяемые объекты, такие как массивы или коллекции, возвращайте их копии, а не оригиналы.

    public final class ImmutableClass {
        private final int[] values;
    ​
        public ImmutableClass(int[] values) {
            this.values = values.clone(); // Клонируем массив, чтобы избежать изменения оригинала
        }
    ​
        public int[] getValues() {
            return values.clone(); // Возвращаем копию массива
        }
    }
    

Пример иммутабельного класса

Рассмотрим пример иммутабельного класса ImmutablePoint, представляющего точку в двумерном пространстве:

public final class ImmutablePoint {
    private final int x;
    private final int y;
​
    // Конструктор, инициализирующий поля
    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
​
    // Геттер для поля x
    public int getX() {
        return x;
    }
​
    // Геттер для поля y
    public int getY() {
        return y;
    }
}
  • final класс: ImmutablePoint объявлен как final, чтобы предотвратить наследование.
  • final поля: Поля x и y объявлены как final, что гарантирует их неизменность после инициализации.
  • Конструктор: Поля инициализируются в конструкторе, и после этого не могут быть изменены.
  • Геттеры: Предоставляются только методы для чтения значений полей, без возможности их изменения.

Применение

Иммутабельные классы широко используются в Java, например, класс String является иммутабельным. Иммутабельность упрощает многопоточное программирование, так как объекты не могут быть изменены после создания, что исключает необходимость синхронизации. Это также упрощает проектирование и тестирование, так как состояние объектов остается предсказуемым и неизменным.

Тема: ООП
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки