Какие преимущества и недостатки у иммутабельности в программировании?

«Какие преимущества и недостатки у иммутабельности в программировании?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Преимущества:

  • Потокобезопасность: Иммутабельные объекты безопасны для использования в многопоточной среде без дополнительной синхронизации, так как их состояние после создания изменить нельзя.
  • Предсказуемость и простота: Отсутствие скрытых изменений состояния делает код более понятным, упрощает отладку и рассуждения о программе.
  • Безопасное кэширование и повторное использование: Объекты можно свободно кэшировать и передавать между компонентами без риска их случайного изменения.
  • Надежные ключи в коллекциях: Идеально подходят для использования в качестве ключей в 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 полей
}