Рубрики
Без рубрики

экземпляр (Сопоставление с образцом) JEP 305

Каждый разработчик java написал код, подобный приведенному ниже: if(str instanceof строка){ int len = ((Стри… Помеченный как java, производительность.

Каждый разработчик Java написал код, подобный приведенному ниже:

if(str instanceof String ){
    int len = ((String)str).length();
}

В приведенном выше фрагменте

  • Сначала выполняется проверка, чтобы подтвердить, что ‘str’ относится к классу типа String, если да
  • ‘str’ преобразуется в строковый объект после успешного приведения
  • длина вычисляется и присваивается int.

Вы, должно быть, задавали этот вопрос, почему я должен делать этот кастинг, если я уже проверял тип раньше. После успешной проверки типа только управление будет передано внутри блока if, тогда “str” может быть только строкой или ее подклассом, другой возможности нет, компилятор не должен просить меня об этом ненужном приведении.

И всегда есть возможность написать такой ошибочный код, как этот:

if(str instanceof String ){
    int len = ((Integer)str);
}

это будет отлично скомпилировано на вашей СТОРОНЕ, и вы увидите приятный “java.lang. ClassCastException” во время выполнения.

JEP 305 (Предварительный просмотр в JDK14)

Экземпляр был расширен для поддержки шаблона тестирования типов. Теперь вы будете кодировать так:

if(str instanceof String s){
    System.out.println("length is "+s.length());
}

здесь instanceof проверяет тип ‘str’ как строку и присваивает его переменной привязки ‘ s ‘. Это выглядит намного аккуратнее по сравнению со старой версией.

Несколько важных вещей, которые нужно иметь в виду:

  • Область действия переменной привязки

Следует иметь в виду, что область действия переменной привязки находится только в операторе true , т.е. в приведенном ниже блоке кода

  if(str instanceof String s){
  }else{
      System.out.println(s.length());
  }

попытка получить доступ к переменной привязки ‘ s ‘ в блоке else приведет к ошибке во время компиляции ” не удается найти символ “, так как “s” не отображается в блоке else.

Аналогично если вы написали фрагмент кода, как показано ниже

  private static void newInstanceOfNeg(Object str){
      if(!(str instanceof String s)){
      }else{
          System.out.println(s.length());
      }
  }

‘s’ будет доступен только в блоке else, любая попытка доступа к нему в блоке if приведет к ошибке во время компиляции.

  • Если имя переменной привязки совпадает с другой переменной в области действия метода или класса, это может быть неприятным местом для скрытия ошибки. Поэтому нам нужно быть очень осторожными, называя их

    • Имя переменной привязки в области действия метода

    Обратите внимание на фрагмент ниже, здесь переменная привязки с именем ‘s’ и метод также имеют другую локальную переменную с тем же именем

    хорошая часть заключается в том, что это не будет компилироваться, и вы увидите ошибку типа “ошибка: переменные уже определены”.

    Но если вы напишете что-то вроде

    здесь переменная привязки, названная “str”, но в истинном блочном коде все еще ссылается на переменную метода “s”. Он будет компилироваться и работать идеально без каких-либо ошибок, но такая опечатка может оказаться ошибкой.

    • Если переменная привязки имеет то же имя, что и переменная экземпляра

    Вопрос – Что произойдет, если переменная привязки имеет то же имя, что и переменная экземпляра и вы пытаетесь получить к нему доступ в истинном блоке, см. Фрагмент ниже?

    и если вы вызываете эту функцию с

    вы увидите вывод как “6”, а не “3”. Здесь приоритет будет иметь переменная привязки.

    Вопрос – Что произойдет, если переменная привязки имеет то же имя, что и переменная экземпляра и вы пытаетесь получить к нему доступ в ложном блоке, см. Фрагмент ниже?

    и если вы вызываете эту функцию с

    вы увидите вывод как “3”, потому что в другом экземпляре блока видна переменная “s”.

    • Тестовый шаблон с оператором &&

    Обычно условно, если блок имеет несколько операторов для удовлетворения определенных бизнес-потребностей. Давайте рассмотрим пример, в котором оператор ‘ && ‘ присутствует вместе с тестовым шаблоном instanceof, см. Фрагмент ниже:

    здесь вы можете видеть, что в блоке if после экземпляра тестового шаблона также есть проверка “содержит”, разделенная оператором ” &&” . Правая часть ‘&&’ будет выполнена только в том случае, если тестовый шаблон instanceof прошел успешно.

    • Тестовый шаблон с оператором

    Как и выше, допустим, у нас есть оператор

    после экземпляра тестового шаблона ‘s’ не будет доступен с правой стороны ‘

    ' блокировать ни в операторе if, ни в блоке else (если есть переменная экземпляра с тем же именем 's', которая будет доступна )

    Тестовый шаблон с оператором

Скомпилировать и запустить

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

  javac --enable-preview --release 14 

он скомпилирует и создаст класс. Теперь, чтобы запустить его, просто используйте команду java с включенным предварительным просмотром.

Если вы хотите использовать функцию JDK11, при которой один исходный файл можно напрямую скомпилировать и запустить с помощью одной команды java, следуйте приведенной ниже команде.

  java --enable-preview --source 14 

Оригинал: “https://dev.to/imagarg/instanceof-pattern-matching-jep-305-5613”