Найти тему
JavAKnazzz

Java. Мутабельный и имутабельный класс.

  1. Мутабельный класс (mutable class) - это класс, объекты которого могут быть изменены после их создания.
    Это означает, что состояние объекта может быть изменено путем изменения его полей или вызова методов, которые изменяют его состояние.
    Примером мутабельного класса может быть класс, представляющий счетчик, где значение счетчика может быть увеличено или уменьшено.

    Имутабельный класс (immutable class) - это класс, объекты которого не могут быть изменены после их создания.
    Это означает, что состояние объекта остается неизменным в течение его жизненного цикла. Вместо изменения состояния объекта, создается новый объект с новым состоянием.
    Примером имутабельного класса может быть класс, представляющий дату, где дата не может быть изменена, а только создан новый объект с другой датой.

    Имутабельные классы имеют ряд преимуществ, таких как потокобезопасность, легкость в разработке и отладке, возможность использования в качестве ключей в хеш-таблицах и многие другие.
    Однако, они также имеют некоторые недостатки, такие как необходимость создания нового объекта при каждом изменении состояния, что может привести к потере производительности при работе с большими объемами данных.

    Чтобы создать свой имутабельный класс, нужно выполнить следующие шаги:

    1. Объявить класс с приватными полями, которые будут представлять состояние объекта.
    2. Установить значения полей в конструкторе класса и не предоставлять методы для изменения этих значений после создания объекта.
    3. Объявить все методы класса как неизменяемые (immutable), то есть такие, которые не изменяют состояние объекта и возвращают новый объект с обновленным состоянием, а не изменяют текущий объект.
    4. Переопределить методы equals() и hashCode(), чтобы обеспечить корректное сравнение и использование объектов этого класса в хеш-таблицах.
    5. Если требуется, переопределить метод toString() для предоставления строкового представления объекта.

    public final class ImmutableDate {
    private final int day;
    private final int month;
    private final int year;

    public ImmutableDate(int day, int month, int year) {
    this.day = day;
    this.month = month;
    this.year = year;
    }

    public int getDay() {
    return day;
    }

    public int getMonth() {
    return month;
    }

    public int getYear() {
    return year;
    }

    public ImmutableDate withDay(int day) {
    return new ImmutableDate(day, month, year);
    }

    public ImmutableDate withMonth(int month) {
    return new ImmutableDate(day, month, year);
    }

    public ImmutableDate withYear(int year) {
    return new ImmutableDate(day, month, year);
    }

    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    ImmutableDate that = (ImmutableDate) o;
    return day == that.day && month == that.month && year == that.year;
    }

    @Override
    public int hashCode() {
    return Objects.hash(day, month, year);
    }

    @Override
    public String toString() {
    return String.format("%02d/%02d/%04d", day, month, year);
    }
    }