Сильная неизменность и слабая неизменность в Java?

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

Убедитесь, что методы не могут быть переопределены путем создания класса (Сильная неизменность) или сделать ваши методы окончательными (слабый неизменность).

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

Ответ 1

Поскольку Принцип замены Лискова утверждает, что экземпляр подкласса может быть заменен везде, где ожидается экземпляр суперкласса, без изменения семантики с точки зрения вызывающего. Подкласс может вводить изменчивое поведение, нарушая тем самым LSP.

С одной стороны, конечные методы (и частные переменные-члены) ограничивают возможности для изменения семантики, как видно непосредственно через интерфейс суперкласса. С другой стороны, изменяемый подкласс может косвенно вводить нарушения.

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

Ответ 2

Создание окончательного класса гарантирует, что вы не можете подклассифицировать его, что означает, что класс не открыт для расширения. Невосприимчивость - это не только сохранение исходного состояния объекта, но и обеспечение того, чтобы не было изменений в поведении.

Но если класс не помечен как final, то всегда есть возможность подклассифицировать его и изменить его реализацию, и мы знаем, что родительская ссылка может ссылаться на дочерний объект. Таким образом, существует возможность нарушения неизменности.