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