[PT-BR] 패턴 매칭 com instanceof
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.
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.
ContaCorrente
e ContaPoupanca
três vezes em duas linhas de código. 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. 근접 촬영!
Reference
이 문제에 관하여([PT-BR] 패턴 매칭 com instanceof), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/j_a_o_v_c_t_r/pt-br-pattern-matching-com-instanceof-ic4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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();
}
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ívelswitch(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. 근접 촬영!
Reference
이 문제에 관하여([PT-BR] 패턴 매칭 com instanceof), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/j_a_o_v_c_t_r/pt-br-pattern-matching-com-instanceof-ic4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([PT-BR] 패턴 매칭 com instanceof), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/j_a_o_v_c_t_r/pt-br-pattern-matching-com-instanceof-ic4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)