Java всегда считался языком verbose. Много строк кода, написанных для выполнения простых задач. Несмотря на то, что платформа края с момента появления, эта функция всегда преследовал его. В JDK 10 предусмотрена JEP (JDK Enhancement Proposals) , номер 322, сообщает, что изменения в выпуске релизов. Новые версии будут выходить каждые 6 месяцев. Одной из причин для таких действий является непрерывное совершенствование, так как обеспечивает features кратчайшие сроки, и вы получаете постоянную обратную связь от сообщества. Были внесены изменения в платформу, в целом, как и в | JDK/|, Garbage Collector и на сам язык. Выступая на изменения в языке, чувствуется обеспокоенность в связи с таким уровнем детализации и JEP 375-это прекрасный пример этого. A JET em Запрашивает/| Сопоставление с образцом для примера , например, язык com сопоставление с образцом .
Pattern Matching это метод, который был адаптирован для многих стилей разных языков программирования, начиная с 1960-х годов, в том числе объектно-ориентированные языки текста, как SNOBOL4 и AWK, функциональных языков, таких как Haskell и ML, и совсем недавно расширенной объектно-ориентированных языки, как Scala (и совсем недавно, в C #).
( https://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html )
Pattern Matching позволяет “образом” желаемого объекта будет выражена сжато, ((образец) и несколько инструкций и выражения испытать это “форма” по отношению к входным (Баланс) .
( https://openjdk.java.net/jeps/375 )
Каждый разработчик уже пришлось написать некоторую логику, которая проверяет, если выражение имеет определенный тип, и если это правда, извлечь какой-либо информации для последующей обработки. Примером этого является операция с instanceof
.
if(conta instanceof ContaCorrente) { ContaCorrente contaCorrente = (ContaCorrente) conta; System.out.println(contaCorrente.mostrarExtrato()); } else if(conta instanceof ContaPoupanca) { ContaPoupanca contaPoupanca = (ContaPoupanca) conta; System.out.println(contaPoupanca.mostrarExtrato()); } // Demais else if's que poderão existir
Приведенный выше код является функциональным, однако есть некоторые моменты, внимание.
- Повтор кода: он Использует
ContaCorrente
иContaPoupanca
три раза в две строки кода. - Кастинг: Могут скрыть ошибки (ошибок) , что не будут проверяться во время компиляции.
- Низкая сплоченность: “Повторение” и ” кастинги затруднить чтение, а, следовательно, понимание фрагмент кода.
Оператор instanceof
расширен, чтобы получить стандартный тест типа, а не только один тип.
if(conta instanceof ContaCorrente contaCorrente) { System.out.println(contaCorrente.mostrarExtrato()); } else if(conta instanceof ContaPoupanca contaPoupanca) { System.out.println(contaPoupanca.mostrarExtrato()); } // Demais else if's que poderão existir
По сравнению с предыдущем примере, обработки отличается в несколько пунктов. Оператор “сочетает в себе” целевой объект по умолчанию, тест типа следующим образом. Счета
экземпляр ContaCorrente
, это сделано casting (неявные) для переменной contaCorrente
и эта переменная будет находиться в области действия блока.
Важно отметить, что при наличии else
переменная не будет частью вашей сферы.
if(objeto instanceof String string) { // string está no escopo do bloco true string.toLowerCase(); } else { // string NÃO está no escopo do bloco false string.toString(); }
Вы понимаете, что точки внимания в предыдущем примере, уже не возникает.
Несмотря на значительное улучшение в том, как написать код выше, как нужно проверять новые типы счетов, читаемость находится под угрозой. Думая об этом, будущее JEP предусматривает улучшение pattern matchings для switch
и следующий код будет возможный
switch(conta) { case ContaCorrente cc -> cc.numero = 12345; case ContaPoupanca cp -> cp.numero = 12345; // Demais cases que poderão existir }
Наиболее интересным такого подхода в том, что не требуется default
, потому что необходимо гарантировать, что все сравнения делаются на cases
(Необходимо проверить всех детей Счет
) и в случае, если одно или более сравнений не будут сделаны, то будет ошибка компиляции.
Вы понимаете, что инженеры и разработчики языка есть, если волнует вопрос детализации языка. С выпуском релизов 6 в 6 месяцев, быстрого улучшения можно почувствовать. Идея поста была показать один из этих улучшений и план на будущее. Если какой-либо из пунктов не был, конечно, я открыт на все вопросы и/или предложения. До свидания!
Оригинал: “https://dev.to/j_a_o_v_c_t_r/pt-br-pattern-matching-com-instanceof-ic4”