В каких случаях следует использовать изменяемые (mutable) объекты?

«В каких случаях следует использовать изменяемые (mutable) объекты?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Изменяемые (mutable) объекты позволяют модифицировать своё внутреннее состояние после создания.

Основные сценарии использования:

  1. Производительность: Избегание накладных расходов на создание новых объектов при частом изменении состояния (например, изменение координат объекта в игровом цикле).
  2. Моделирование сущностей с изменяемым состоянием: Банковский счёт, корзина покупок, конфигурация.
  3. Сложные структуры данных: Большинство стандартных коллекций (ArrayList, HashMap) являются mutable для эффективных операций добавления/удаления.

Пример mutable класса:

public class MutableAccount {
    private double balance;

    public void deposit(double amount) {
        if (amount > 0) {
            this.balance += amount;
        }
    }
    // Геттер для balance
}

Недостатки и риски:

  • Сложность в многопоточности: Требует синхронизации для обеспечения потокобезопасности.
  • Непредсказуемость: Передача mutable объекта по ссылке позволяет неожиданно изменить его состояние в другой части программы.

Рекомендация: Используйте immutable объекты по умолчанию и переходите к mutable только при явной необходимости, обусловленной производительностью или предметной областью.