angle-left

Java 14, pattern matching и instanceOf

Одним из нововведений, которые планируется добавить в Java 14, станет паттерн матчинг, а именно возможность использования шаблонов в конструкции instanceOf.

Во многих JVM-языках программирования паттерн матчинг есть уже давно. Например, для проверки типа объекта и выбора последующих действий в Scala можно использовать case-выражение:

val checkObj: Any = ... // ссылаемся на объект некоторого типа
checkObj match {
   case strObj: String => 
      val strs = strObj.split(" ")
      //other actions
   case scObj: SomeClass =>
      scObj.action()
   case _ => // other actions
}

В Kotlin проверки на тот или иной тип удобно реализовать с использованием smart casts:

val checkObj: Any = ... // ссылаемся на объект некоторого типа
if (checkObj is String) {
   val strs = checkObj.split(" ");
   // другие действия
} else if (checkObj is SomeClass) {
   checkObj.action();
} else { ... }

Также можно написать when-выражение:

val checkObj: Any = ... // ссылаемся на объект некоторого типа
when (checkObj) {
   is String -> {
      val strs = c.split(" ")
      //other actions
   }
   is SomeClass -> checkObj.action
   else -> {
      ...
   }
}

В отличие от Scala и Kotlin текущая версия Java (за номером 13) не дает возможности задания подобных шаблонов, хотя они позволяют заметно сократить объем кода. Например, благодаря шаблонам можно убрать предложения, которые требуются для переприсваивания объектов переменным различных типов.

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

Object checkObj = ... // ссылаемся на объект некоторого типа
if (checkObj instanceOf String) {
   String strObj = (String) checkObj;
   String[] strs = strObj.split(" ");
   // другие действия
} else if (checkObj instanceOf SomeClass) {
   SomeClass scObj = SomeClass (checkObj);
   scObj.action();
} else { ... }

В Java 14 в операторе instanceOf можно будет использовать совпадение по шаблону, а именно сразу ввести переменную, через которую можно использовать объект требуемого типа (в случае соответствия типа объекта требуемому при проверке типу):

Object checkObj = ... // ссылаемся на объект некоторого типа
if (checkObj instanceOf String strObj) {
   String[] strs = strObj.split(" ");
   // другие действия
} else if (checkObj instanceOf SomeClass scObj) {
   scObj.action();
} else { ... }

Совпадение будет найдено, если checkObj не null. В будущих версиях Java планируется расширить использование паттерн матчинга в различных конструкциях языка программирования, например, для написания условий в switch.

Вперед

В сферу интересов входят вопросы, связанные с хранением данных и парадигмами программирования.

Предпочитаю Java и Scala.