В сентябре выйдет Java 15 с новой фичей: sealed classes.
Sealed классы и интерфейсы явно определяют список наследников:
public sealed class ShapeКлассы, которых нет в блоке permits, не могут наследоваться от sealed класса. Проверка идёт во время компиляции или в IDE. В Intellij IDEA уже в июле добавили поддержку sealed типов.
permits Circle, Rectangle
Плюс в java.lang.Class добавилось два метода:
🔸ClassDesc[] getPermittedSubclasses()❓Зачем?
🔸boolean isSealed()
Глобальная цель - поддержка pattern matching. Чтобы вместо
if (s instanceof Circle) {…}
else if (s instanceof Rectangle) {…}
использовать switch:switch (s) {
case Circle c -> …
case Rectangle r -> …
❓Где пригодятся sealed классы?При реализации паттерна State. Раньше конечный набор состояний выражался только через enum:
enum State {NEW, VERIFIED;}
❌ Все элементы и методы хранятся вместе. Если методов много, то размер файла растёт, и читаемость снижается.❌ Значения в конструкторе жёстко задаются на этапе компиляции.
enum State {
NEW(12);
int rating;
State(int rating) {…}
}
Теперь с помощью sealed класса:✅ Каждое состояние в отдельном файле.
✅ Экземпляры создаются во время работы программы. Конструктор принимает параметры, а не константы.