Java 15: sealed classes



В сентябре выйдет Java 15 с новой фичей: sealed classes.



Sealed
классы и интерфейсы явно определяют список наследников:

public sealed class Shape

permits Circle, Rectangle



Классы, которых нет в блоке permits, не могут наследоваться от sealed класса. Проверка идёт во время компиляции или в IDE. В Intellij IDEA уже в июле добавили поддержку sealed типов.



Плюс в 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 класса:

Каждое состояние в отдельном файле.

Экземпляры создаются во время работы программы. Конструктор принимает параметры, а не константы.