← Назад к вопросам

Зачем нужен mutable объект?

2.0 Middle🔥 201 комментариев
#ООП#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Mutable объекты в Java

Определение и суть

Mutable (изменяемый) объект — это объект, состояние которого можно изменить после его создания. В противоположность immutable (неизменяемым) объектам, которые после создания не меняют своё состояние.

Примеры:

  • Mutable: ArrayList, HashMap, StringBuilder, пользовательские классы с setters
  • Immutable: String, Integer, LocalDate, LocalDateTime

Зачем нужны Mutable объекты

1. Производительность и эффективность памяти

// Неправильно (используем String — immutable)
String result = "";
for (int i = 0; i < 1000; i++) {
    result += "item" + i; // Создаёт 1000 новых String объектов!
}

// Правильно (используем StringBuilder — mutable)
StringBuilder result = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    result.append("item").append(i); // Переиспользует один объект
}
String finalResult = result.toString();

Mutable StringBuilder значительно быстрее, чем создавать новые String объекты в цикле.

2. Модификация коллекций

// ArrayList — mutable коллекция
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.remove(0); // Легко добавлять и удалять элементы

// Если бы мы использовали immutable List, пришлось бы создавать новый список при каждом изменении

3. Изменение состояния объекта без создания нового

public class User {
    private String name;
    private int age;
    
    // Mutable setters
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
}

User user = new User();
user.setName("John"); // Изменяем существующий объект
user.setAge(30); // Не создаём новый User, просто обновляем состояние

Производительность

Mutable объекты дешевле:

  • Не требуют создание новых объектов при изменении
  • Меньше нагрузка на Garbage Collector
  • Быстрее при работе с большими объёмами данных

Практический пример: работа с состоянием

public class GameSession {
    private int score; // mutable state
    private List<Move> moves; // mutable коллекция
    
    public void addScore(int points) {
        this.score += points; // Изменяем существующий объект
    }
    
    public void recordMove(Move move) {
        this.moves.add(move); // Добавляем в существующий список
    }
}

GameSession session = new GameSession();
session.addScore(10); // Обновляем состояние
session.recordMove(new Move()); // Добавляем ход

Когда использовать Mutable, когда Immutable

Используйте Mutable когда:

  • Часто изменяется состояние объекта
  • Нужна высокая производительность
  • Работаете с коллекциями
  • Нужна гибкость в обновлении данных

Используйте Immutable когда:

  • Объект используется как ключ в HashMap
  • Объект передаётся между потоками (thread-safety)
  • Нужна простота и предсказуемость
  • Значение не должно изменяться

Важный баланс

В современной Java рекомендуется искать баланс:

  • Mutable коллекции (ArrayList, HashMap) для внутренней работы
  • Immutable объекты (String, records, final классы) для публичного API и thread-safety
// Хороший паттерн: внутри используем mutable, снаружи отдаём immutable копию
public class Service {
    private List<Item> items = new ArrayList<>(); // mutable
    
    public List<Item> getItems() {
        return Collections.unmodifiableList(items); // immutable снаружи
    }
}

Mutable объекты — это фундамент эффективной Java программы, особенно когда речь идёт о производительности и работе с большими объёмами данных.