Pular para o conteúdo principal

Java 16 - Pattern Matching for instanceof

 


Java 16 - Pattern Matching for instanceof


Este é mais um recurso introduzido no Java 14 como preview e continuou assim até ser liberado definitivamente no Java 16.

O objetivo é deixar o instanceof mais simples e seguro uma vez que o “cast” é feito em tempo de compilação. Mas não é apenas isso...

public class Animal {

  public void dizerOla(Animal animal) {
      if (animal instanceof Cao cao) {
          cao.latir();
      } else if (animal instanceof Gato gato) {
          gato.miar();
      }
  }

}

Ainda podemos utilizar expressões mais complexas para validar a instância

} else if (animal instanceof Gato gato && gato.getIdade() > 5) {

Neste caso, podemos ter algumas restrições quanto às expressões após o instanceof. Por exemplo, não podemos utilizar a expressão ||. A explicação para isso é que por causa da semântica do operador ||, a variável padrão gato pode não ter sido atribuída e, portanto, a análise de fluxo determina que a variável gato não está no escopo no lado direito do operador ||.

} else if (animal instanceof Gato gato || gato.getIdade() > 5) {

    >> Cannot resolve symbol 'gato'

O código acima não compila, pois não se pode ter certeza que a variável gato será atribuída.

Conclusão

Esta mudança não é simplesmente para deixar o instanceof mais simples e sim permitir que os records, expressões switch e futuramente padrões de desconstrução tão fácil como construir um objeto.

Referências

https://openjdk.java.net/jeps/394

https://www.infoq.com/articles/java-pattern-matching/


Comentários

Postagens mais visitadas deste blog

Certificação Java 11 - O que mudou

Certificação Java 11 - O que mudou A Oracle liberou recentemente uma atualização das suas certificações Java para atender a nova versão Java 11  LTS (Long Term Support) . Mas o que muda em relação a certificação Java 8? Preciso me atualizar? Por onde começo?  Neste post, vamos responder estas e outras questões sobre essa nova série de certificações. Caso você não tenha acompanhado a série sobre certificação, recomendo a leitura dos posts anteriores: https://www.guiadojava.com.br/2018/06/guia-da-certificacao-java-se-8.html Também temos um bate papo com os maiores especialistas de Java do mercado. Assista o replay aqui: https://events.genndi.com/replay/169105139238448348/23a5b3a7b0/0/83729443273C Nomenclatura e requisitos A partir de agora, você não receberá o certificado se fizer apenas a primeira prova, como era no Java 8 (1Z0-808 - Java SE 8 Programmer I). Você terá que fazer duas provas para obter o certificado " Oracle Certified Professional: Java SE 11 Dev

JDK 18: Os novos recursos do Java 18

JDK 18: Os novos recursos do Java 18 Com o lançamento em março, o Java 18 incuba uma API vetorial , disponibiliza o “pattern matching for switch statements” como preview feature, adota UTF-8 como o conjunto de caracteres padrão e inclui um servidor web simples. O Java Development Kit (JDK) 18 está programado para ser lançado em 22 de março de 2022. A nova versão do Java padrão terá nove novos recursos, com o conjunto de recursos congelado em 9 de dezembro. O JDK 18 passou para um estágio de release candidate, após duas fases de rampdown realizadas entre dezembro e fevereiro. Um segundo release candidate está previsto para 24 de fevereiro. As atualizações do Java padrão são lançadas a cada seis meses, com a versão mais recente, JDK 17 , chegando em setembro de 2021. A página OpenJDK lista os seguintes recursos como direcionados oficialmente ao JDK 18: uma interface de provedor de serviços, um servidor web simples, uma terceira incubação da API vetorial, trechos de código, uma

Java Records

  Java Records Imutável, Simples e limpa Esta funcionalidade da linguagem apareceu pela primeira vez na versão 14 como experimental e assim continuou até a versão 15 . Agora liberada de forma definitiva no Java 16 . O objetivo é ser possível ter classes que atuam como portadores transparentes de dados imutáveis. Os registros podem ser considerados tuplas nominais. Ou seja, após criado, um record não pode mais ser alterado. Records oferece uma uma sintaxe compacta para declarar classes que são portadores transparentes para dados imutáveis superficiais visando reduzir significamente o detalhamento dessas classes e irá melhorar a capacidade de leitura e manutenção do código. Vamos seguir um exemplo de uma classe chamada Pessoa . O primeiro exemplo vamos utilizar o modo tradicional. public class Pessoa { private String nome; private int idade; public Pessoa (String nome, int idade) { super (); this .nome = nome; this .idade = idade; } public String getNo