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

Правила создания immutable-класса

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

Для создания immutable-класса в Java необходимо: сделать класс финальным, чтобы предотвратить наследование; все поля должны быть приватными и финальными; не предоставлять сеттеры; обеспечить глубокое копирование изменяемых объектов в конструкторах и методах доступа; вернуть копии изменяемых объектов в геттерах.

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

Immutable-класс — это класс, экземпляры которого не могут быть изменены после создания. Это свойство делает такие классы особенно полезными в многопоточных приложениях, так как они являются потокобезопасными без необходимости в синхронизации. Рассмотрим основные правила создания immutable-класса в Java.

  1. Сделать класс финальным:

    • Использование ключевого слова final перед объявлением класса предотвращает его наследование. Это важно, потому что подклассы могут изменить поведение класса и нарушить его неизменяемость.
    public final class ImmutableClass {
        // Класс объявлен как final
    }
    
  2. Сделать все поля приватными и финальными:

    • Поля должны быть private, чтобы предотвратить прямой доступ к ним извне класса.
    • Поля должны быть final, чтобы их можно было инициализировать только один раз, в конструкторе.
    public final class ImmutableClass {
        private final int value;
        // Поле value объявлено как private и final
    }
    
  3. Не предоставлять сеттеры:

    • Сеттеры позволяют изменять состояние объекта после его создания, что противоречит концепции неизменяемости.
    // Отсутствие сеттеров
    
  4. Инициализация всех полей в конструкторе:

    • Все поля должны быть инициализированы в конструкторе. Это гарантирует, что объект будет полностью инициализирован при создании.
    public final class ImmutableClass {
        private final int value;
    ​
        public ImmutableClass(int value) {
            this.value = value;
            // Поле value инициализируется в конструкторе
        }
    }
    
  5. Глубокое копирование изменяемых объектов:

    • Если класс содержит изменяемые объекты (например, массивы или коллекции), необходимо использовать глубокое копирование, чтобы предотвратить изменение этих объектов извне.
    public final class ImmutableClass {
        private final int[] array;
    ​
        public ImmutableClass(int[] array) {
            this.array = array.clone(); // Глубокое копирование массива
        }
    }
    
  6. Возвращать копии изменяемых объектов в геттерах:

    • Если необходимо предоставить доступ к изменяемым объектам, возвращайте их копии, чтобы изменения не повлияли на внутреннее состояние объекта.
    public final class ImmutableClass {
        private final int[] array;
    ​
        public ImmutableClass(int[] array) {
            this.array = array.clone();
        }
    ​
        public int[] getArray() {
            return array.clone(); // Возвращаем копию массива
        }
    }
    

Эти правила помогают создать класс, который будет неизменяемым, обеспечивая безопасность и простоту использования в многопоточных средах. Immutable-классы широко используются в Java, например, такие классы, как String, Integer, LocalDate, являются неизменяемыми.

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

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

Твои заметки