Правила создания immutable-класса
1️⃣ Как кратко ответить
Для создания immutable-класса в Java необходимо: сделать класс финальным, чтобы предотвратить наследование; все поля должны быть приватными и финальными; не предоставлять сеттеры; обеспечить глубокое копирование изменяемых объектов в конструкторах и методах доступа; вернуть копии изменяемых объектов в геттерах.
2️⃣ Подробное объяснение темы
Immutable-класс — это класс, экземпляры которого не могут быть изменены после создания. Это свойство делает такие классы особенно полезными в многопоточных приложениях, так как они являются потокобезопасными без необходимости в синхронизации. Рассмотрим основные правила создания immutable-класса в Java.
-
Сделать класс финальным:
- Использование ключевого слова
finalперед объявлением класса предотвращает его наследование. Это важно, потому что подклассы могут изменить поведение класса и нарушить его неизменяемость.
public final class ImmutableClass { // Класс объявлен как final } - Использование ключевого слова
-
Сделать все поля приватными и финальными:
- Поля должны быть
private, чтобы предотвратить прямой доступ к ним извне класса. - Поля должны быть
final, чтобы их можно было инициализировать только один раз, в конструкторе.
public final class ImmutableClass { private final int value; // Поле value объявлено как private и final } - Поля должны быть
-
Не предоставлять сеттеры:
- Сеттеры позволяют изменять состояние объекта после его создания, что противоречит концепции неизменяемости.
// Отсутствие сеттеров -
Инициализация всех полей в конструкторе:
- Все поля должны быть инициализированы в конструкторе. Это гарантирует, что объект будет полностью инициализирован при создании.
public final class ImmutableClass { private final int value; public ImmutableClass(int value) { this.value = value; // Поле value инициализируется в конструкторе } } -
Глубокое копирование изменяемых объектов:
- Если класс содержит изменяемые объекты (например, массивы или коллекции), необходимо использовать глубокое копирование, чтобы предотвратить изменение этих объектов извне.
public final class ImmutableClass { private final int[] array; public ImmutableClass(int[] array) { this.array = array.clone(); // Глубокое копирование массива } } -
Возвращать копии изменяемых объектов в геттерах:
- Если необходимо предоставить доступ к изменяемым объектам, возвращайте их копии, чтобы изменения не повлияли на внутреннее состояние объекта.
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, являются неизменяемыми.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться