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

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

1️⃣ Как кратко ответить

Нет, класс не останется иммутабельным после наследования от другого класса, если родительский класс не является иммутабельным. Иммутабельность требует, чтобы все поля были неизменяемыми, а методы не изменяли состояние объекта. Если родительский класс не соблюдает эти условия, то и наследуемый класс не сможет быть иммутабельным.

2️⃣ Подробное объяснение темы

Иммутабельность в программировании означает, что объект не может быть изменен после его создания. Это свойство важно для обеспечения безопасности потоков, предсказуемости поведения и упрощения отладки. В Java класс считается иммутабельным, если:

  1. Все его поля объявлены как final.
  2. Поля инициализируются только один раз, обычно в конструкторе.
  3. Нет методов, которые изменяют состояние объекта.
  4. Класс объявлен как final, чтобы предотвратить наследование и изменение поведения.

Когда класс наследуется от другого класса, он автоматически получает все поля и методы родительского класса. Если родительский класс не является иммутабельным, то и наследуемый класс не сможет быть иммутабельным, поскольку он может унаследовать изменяемые поля или методы, которые изменяют состояние объекта.

Рассмотрим пример:

// Родительский класс
class MutableParent {
    private int value;
​
    public MutableParent(int value) {
        this.value = value;
    }
​
    public void setValue(int value) {
        this.value = value; // Изменяет состояние объекта
    }
​
    public int getValue() {
        return value;
    }
}
​
// Наследуемый класс
final class Child extends MutableParent {
    public Child(int value) {
        super(value);
    }
}
  • MutableParent — это изменяемый класс, так как он имеет метод setValue, который изменяет состояние объекта.
  • Child наследует от MutableParent, и, несмотря на то, что он объявлен как final, он не может быть иммутабельным, потому что унаследовал изменяемое поведение от MutableParent.

Чтобы класс оставался иммутабельным после наследования, родительский класс также должен быть иммутабельным. Это означает, что все условия иммутабельности должны быть соблюдены в родительском классе. Например:

// Иммутабельный родительский класс
final class ImmutableParent {
    private final int value;
​
    public ImmutableParent(int value) {
        this.value = value; // Поле инициализируется один раз
    }
​
    public int getValue() {
        return value; // Нет методов, изменяющих состояние
    }
}
​
// Наследуемый класс
final class ImmutableChild extends ImmutableParent {
    public ImmutableChild(int value) {
        super(value);
    }
}
  • ImmutableParent — это иммутабельный класс, так как все его поля final, и нет методов, изменяющих состояние.
  • ImmutableChild наследует от ImmutableParent и остается иммутабельным, так как унаследовал только иммутабельное поведение.

Таким образом, для сохранения иммутабельности в наследуемом классе, родительский класс также должен быть иммутабельным.

Тема: ООП
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки