Ответ
Преимущества:
- Потокобезопасность: Иммутабельные объекты безопасны для использования в многопоточной среде без дополнительной синхронизации, так как их состояние после создания изменить нельзя.
- Предсказуемость и простота: Отсутствие скрытых изменений состояния делает код более понятным, упрощает отладку и рассуждения о программе.
- Безопасное кэширование и повторное использование: Объекты можно свободно кэшировать и передавать между компонентами без риска их случайного изменения.
- Надежные ключи в коллекциях: Идеально подходят для использования в качестве ключей в
HashMapили элементах вHashSet, так как ихhashCode()не изменяется.
Недостатки:
- Потребление памяти: Каждое "изменение" приводит к созданию нового объекта, что может увеличить нагрузку на сборщик мусора.
- Производительность: Частое создание объектов, особенно в циклах или при интенсивных вычислениях, может быть менее эффективным по сравнению с изменяемыми структурами.
Пример на Java:
// Иммутабельный класс объявляется как final
public final class ImmutablePoint {
// Поля объявляются как final и инициализируются в конструкторе
private final int x;
private final int y;
public ImmutablePoint(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y; }
// Метод для "модификации" — возвращает новый объект
public ImmutablePoint withX(int newX) {
return new ImmutablePoint(newX, this.y);
}
// hashCode и equals также должны быть реализованы на основе final полей
}