Sobes.tech
Junior
145

Что вы понимаете под иммутабельностью в контексте программирования на Java?

AI-дан жауап

sobes.tech AI

Неизменяемость состояния объекта после его создания. Для иммутабельных объектов нет методов, изменяющих внутреннее состояние. Любая операция, которая могла бы его модифицировать, вместо этого возвращает новый объект с измененным состоянием.

Основные свойства иммутабельных классов в Java:

  • Все поля помечены как final.
  • Класс помечен как final (или все конструкторы приватные с фабричными методами).
  • Для полей примитивных типов их значение устанавливается в конструкторе и не меняется.
  • Для полей ссылочных типов их значение также устанавливается в конструкторе. Mutator-методы (setters) отсутствуют. Если поле является ссылкой на изменяемый объект, при создании или возврате его копируется (глубокое копирование, если необходимо).

Преимущества иммутабельности:

  • Потокобезопасность: Иммутабельные объекты автоматически потокобезопасны, так как их состояние не может меняться, устраняя проблемы синхронизации.
  • Простота: Состояние объекта предсказуемо, что упрощает отладку и понимание кода.
  • Кеширование: Так как состояние не меняется, можно безопасно кешировать значение хэш-кода.
  • Безопасность: Изменяемые объекты могут быть уязвимы к изменению их состояния после создания, что нарушает инкапсуляцию.

Пример иммутабельного класса:

// Immutable class example
public final class ImmutablePoint {
    private final int x; // final and private field
    private final int y; // final and private field

    // Constructor initializes fields
    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // No setters
    public int getX() {
        return this.x;
    }

    public int getY() {
        return this.y;
    }

    // Method returning a new ImmutablePoint object
    public ImmutablePoint translate(int dx, int dy) {
        return new ImmutablePoint(this.x + dx, this.y + dy);
    }
}

Пример использования:

// Usage of ImmutablePoint
ImmutablePoint p1 = new ImmutablePoint(1, 2);
ImmutablePoint p2 = p1.translate(3, 4); // Returns a new object

// p1 remains (1, 2)
// p2 is (4, 6)

Примерами встроенных иммутабельных классов в Java являются String, Integer, Float и другие обертки примитивных типов. Коллекции также имеют реализации с поддержкой иммутабельности (например, List.of(), Set.of(), Map.of()).