Иммутабельный класс — это класс, состояние которого нельзя изменить после создания. Основные характеристики:
final
public final class ImmutablePerson {
// 1. Все поля final и private
private final String name;
private final int age;
private final List<String> hobbies; // mutable-объект
// 2. Параметры конструктора - все необходимые поля
public ImmutablePerson(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
// 3. Глубокая копия для mutable-объектов
this.hobbies = new ArrayList<>(hobbies);
}
// 4. Только геттеры
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 5. Для mutable-полей возвращаем копию или неизменяемую версию
public List<String> getHobbies() {
return Collections.unmodifiableList(hobbies);
// Альтернатива: return new ArrayList<>(hobbies);
}
// 6. Методы "изменения" возвращают новый объект
public ImmutablePerson withAge(int newAge) {
return new ImmutablePerson(this.name, newAge, this.hobbies);
}
}
final
Для полей, содержащих изменяемые объекты (коллекции, массивы):
Реализуются через создание нового объекта:
public ImmutablePerson addHobby(String hobby) {
List<String> newHobbies = new ArrayList<>(this.hobbies);
newHobbies.add(hobby);
return new ImmutablePerson(this.name, this.age, newHobbies);
}
Потокобезопасность:
Предсказуемость:
Кэширование и повторное использование:
Упрощение тестирования:
public final class Location {
private final double latitude;
private final double longitude;
public Location(double latitude, double longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
// Только геттеры
public double getLatitude() {
return latitude;
}
}
Для правильной десериализации может потребоваться:
@Serial
При частом "изменении" через копирование:
Реализация иммутабельного класса в Java требует строгого соблюдения нескольких правил — final-поля, защита mutable-состояния, запрет наследования и правильная работа с методами доступа. Это обеспечивает безопасность, предсказуемость и простоту поддержки кода.