[PT-BR] 패턴 매칭 com instanceof

8539 단어 javaptbr
O Java semper foi thinkado uma linguagem verbosa. 간단한 작업을 수행할 수 있습니다. Apesar de ser uma plataforma de ponta desde os primórdios, esta característica semper o perseguiu. Na JDK 10은 JEP(JDK Enhancement Proposals)를 포함하며, 숫자 322, 릴리스에 대한 정보가 없습니다. Novas versões serão lançadas a cada 6 meses. Um dos motivos para tal ação é a melhoria contínua, pois fornece features em menor tempo e recebe-se feedback constante da comunidade. as mudanças são feitas na plataforma em geral, como na JDK, Garbage Collector e na própria linguagem. Falando nas alterações na linguagem, percebe-se uma preocupação com a tal da verbosidade e a JEP 375 é um belo exemplo disso. JEP em questão é a Pattern Matching for instanceof, que aprimora a linguagem com pattern matching.

Mas afinal, o que é 패턴 매칭?



Pattern Matching é uma técnica, que foi adaptada para muitos estilos diferentes de linguagens de programação, desde a década de 1960, incluindo linguagens orientadas a texto como SNOBOL4 e AWK, Hasonadallinguagens funciient como 스칼라(e mais Recentemente, C#).

( https://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html )

Pattern Matching "forma"desejada de um objeto seja expressa de forma concisa (the Patthern) e que várias instruções e expressões testem essa "forma"em relação à entrada (매칭).

( https://openjdk.java.net/jeps/375 )

동기



Todo desenvolvedor já precisou escrever alguma lógica que verifica se uma expressão tem um determinado tipo e, caso seja verdade, extrair alguma informação para processamento posterior. Um exemplo disso é uma operação com o 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


O código acima é funcional, porém existem alguns pontos de atenção.
  • Repetição de código: Usa-se ContaCorrente e ContaPoupanca três vezes em duas linhas de código.
  • 캐스팅: Podem esconder erros (bugs) que não serão verificados em tempo de compilação.
  • Baixa coesão: Repetições e castings atrapalham a leitura econsequentemente o entendimento do trecho de codigo.

  • instanceof에 대한 패턴 일치



    O operador instanceof é estendido para obter um padrão de teste de tipo, em vez de apenas um tipo.

    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
    


    Em relação ao exemplo anterior, o processamento difere em alguns pontos. O 오퍼레이터 "combina"o objeto de destino com o padrão de teste de tipo da seguinte maneira. Se conta for uma instância de ContaCorrente, e feito o casting (implícito) para a variável contaCorrente e esta variável estará no escopo do bloco.

    É Importante ressaltar, que caso exista um else, a variável não fará parte de seu escopo.

    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();
    }
    


    Percebe-se que os pontos de atenção do exemplo anterior já não ocorrem mais.

    후투로



    Ainda que haja uma melhora significativa na forma de escrever o codigo acima, conforme há necessidade de verificar novos tipos de contas, a legibilidade fica comprometida. Pensando nisso, uma futura JEP prevê uma melhora com pattern matchings para switch e o codigo a seguir será possível

    switch(conta) {
         case ContaCorrente cc -> cc.numero = 12345;
         case ContaPoupanca cp -> cp.numero = 12345;
         // Demais cases que poderão existir
    }
    


    O mais interessante dessa abordagem é que não é necessário o default, porque deve-se garantir que todas as comparações estão sendo feitas nos cases (Deve-se verificar todo) não sejam feitas, haverá um erro de compilação.

    결론



    Percebe-se que os engenheiros e desenvolvedores da linguagem tem se preocupado com a questão da verbosidade da linguagem. Com o lançamento de Releases de 6 em 6 meses, uma melhora rápida pode ser sentida. A ideia do post era mostrar uma dessas melhoras e um plano para o futuro. Se algum dos pontos não ficou claro, estou aberto a dúvidas e/ou sugestões. 근접 촬영!

    좋은 웹페이지 즐겨찾기