Ответ
Immutable класс — это класс, состояние которого невозможно изменить после создания объекта. Все поля финализированы, сеттеры отсутствуют, а методы не модифицируют внутреннее состояние.
Признаки immutable класса:
- Все поля объявлены как
final - Класс объявлен как
final(запрещает наследование) - Отсутствуют сеттеры (setter methods)
- Поля инициализируются только в конструкторе
- Методы не изменяют состояние объекта, а возвращают новые экземпляры
- Защита от изменения mutable объектов (если они есть в полях)
Пример реализации:
public final class ImmutablePerson {
private final String name;
private final int age;
private final List<String> hobbies;
public ImmutablePerson(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
// Защитная копия для mutable поля
this.hobbies = new ArrayList<>(hobbies);
}
public String getName() { return name; }
public int getAge() { return age; }
// Возвращаем защитную копию, а не оригинальный список
public List<String> getHobbies() {
return new ArrayList<>(hobbies);
}
// Метод для "изменения" возвращает новый объект
public ImmutablePerson withAge(int newAge) {
return new ImmutablePerson(this.name, newAge, this.hobbies);
}
}
Преимущества:
- Потокобезопасность — объекты можно безопасно использовать в многопоточных средах без синхронизации
- Простота тестирования — состояние объекта предсказуемо
- Безопасное кэширование — объекты можно кэшировать, так как они не изменятся
- Упрощённый код — отсутствуют побочные эффекты от изменения состояния
Типичные примеры в Java: String, Integer, LocalDate, BigDecimal