Java 14 está chegando



Segundo a Oracle, o lançamento do Java 14 está previsto para 17 de março. Gostaria de saber se a data de lançamento está relacionada ao Dia de São Patrício (que é comemorado neste dia) ou não, descobriremos muito em breve. Vamos dar uma olhada nas inovações disponíveis no novo Java e decidir se vamos beber cerveja de alegria ou tristeza.

Registros


Um recurso de linguagem fundamentalmente novo, disponível no modo de visualização em Java 14. O objetivo principal é livrar-se de muitos vermicelli no código. Os registros devem substituir as classes usadas apenas para armazenar dados em campos sem nenhum comportamento descrito. Defina Record , e o próprio compilador gerará os métodos construtor, getters, equals () e hashCode (), toString (). Em algum lugar já vimos, certo, Sr. Lombok? A entrada é a seguinte:

public record Person(String name, int age){}

Para compilar o Registro, você deve fazer o download do jdk14 e inserir o seguinte comando:

javac —enable-preview —release 14 Person.java

Descompilamos e vemos o que o compilador fez:

public final class Person extends java.lang.Record {
    private final java.lang.String name;
    private final int age;

    public Person(java.lang.String name, int age) { /* compiled code */ }

    public java.lang.String toString() { /* compiled code */ }

    public final int hashCode() { /* compiled code */ }

    public final boolean equals(java.lang.Object o) { /* compiled code */ }

    public java.lang.String name() { /* compiled code */ }

    public int age() { /* compiled code */ }
}

Então, em vez de Record, temos uma classe final que herda da nova classe abstrata abstrata de Record . E como esperado, obtivemos os getters gerados, construtor, equals (), hashCode (), toString () . Observe que todos os campos estão marcados como finais , o que significa que não podemos redefini-los. No entanto, o próprio registro não é completamente inalterado, porque objetos armazenados em campos podem ser mutáveis. Uma discussão detalhada da Record pode ser encontrada aqui .

Talkative NullPointerExceptions


Mais amigável será NullPointerExceptions . Não, o compilador ainda não sabe como corrigir o NPE para nós, mas agora a descrição da exceção se tornará mais informativa. Simulamos a situação: chamamos NPE no Java 11 e Java 14. Por exemplo, temos uma composição complexa, típica da Entidade , e para obter os dados, precisamos chamar vários objetos da fonte para chegar ao campo desejado e assim:

var street = message.getAuthor().getAddress().getStreet();

No Java 11, obtemos um registro de erro familiar antigo que deixa a pergunta principal: Quem é nulo? Mensagem, Autor, Endereço?

Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:11)

Para executar no Java 14, você precisa compilar a classe da mesma maneira que o Registro acima:

javac —enable-preview —release 14 Main.java

E execute adicionando um sinalizador especial:

java -XX:+ShowCodeDetailsInExceptionMessages --enable-preview Main

Como resultado da execução, obtemos a seguinte saída:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "Author.getAddress()" is null
	at Main.main(Main.java:11)

Como podemos ver, a mensagem se tornou mais informativa e podemos ver exatamente onde ocorreu o NPE da cadeia de chamadas .

Blocos de texto


Os blocos de texto introduzidos de volta no Java 13 também estão disponíveis no Java 14 como um recurso de visualização. Deixe-me lembrá-lo de que a principal tarefa deles é simplificar o trabalho com literais de várias linhas. Um recurso muito conveniente para escrever consultas SQL, código HTML, JSON . Eu acho que esse é um dos recursos que se tornarão muito úteis. Lembre-se da sintaxe. Por exemplo, precisamos escrever uma consulta SQL . Antes do Java 13, usaríamos a concatenação de strings para escrever uma consulta legível, e a consulta seria algo assim:

String sql = "SELECT name, age " +
                 "FROM PERSON" +
                 "WHERE name = \'Igor\'" +
                 "AND car=\'Niva\'";

A partir do Java 13, podemos usar um bloco de texto escrevendo uma linha entre aspas duplas triplas como esta:


    String sql = """ 
                 SELECT name, age 
                 FROM PERSON
                 WHERE name = 'Igor'
                   AND car='Niva'
                 """;

O Java 14 adiciona dois novos delimitadores que podem ser usados ​​em blocos de texto. O primeiro é um espaço único: \ s . O segundo é o caractere de nova linha: \ .

Alternar expressões


A partir do Java 14, as expressões do switch passam de um recurso de visualização para um recurso completo. Vamos relembrar brevemente os recursos do novo operador:

  • Sintaxe Lambda
  • Capacidade de usar mais de uma expressão em um caso
  • Saída de erro em caso de cobertura incompleta do conjunto de possíveis valores de chave () . Em outras palavras, se você usar uma enumeração:

    public enum  Car {
        NIVA, NEXIA, KIA
    }

    Então, se você escrever switch () da seguinte maneira, o compilador lançará um erro informando que nem todos os casos possíveis da enumeração estão listados:

    switch (car) {
        case NIVA -> System.out.println("Niva");
        case NEXIA -> System.out.println("Nexia");
    }
    // error: the switch expressions does not cover all possible input values.

  • A capacidade de retornar um valor:

    var avto = switch (car) {
        case NIVA, KIA -> "Niva are better";
        case NEXIA -> "Nexia";
        default -> "Niva still better";
    };


Correspondência de padrões


A Correspondência de Padrões é um novo recurso de visualização disponível no Java 14. Falou-se muito sobre isso, muitos estavam esperando por isso e aqui está. O objetivo é combinar a verificação do tipo de objeto e sua conversão na instância do operador . Em outras palavras, antes do Java 14, escreveríamos assim:

Object obj = "Igor";

if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

Essa. para usar os métodos da classe que o objeto é, você precisa convertê-lo nessa classe. A partir do Java 14, está disponível uma nova sintaxe na qual instanceof combina as funções de validação e conversão:

Object obj = "Igor";

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

Conclusão


O Java continua a evoluir, facilitando a vida dos desenvolvedores mortais comuns. Novos recursos foram projetados para tornar o código mais limpo, a vida mais fácil e os salários mais altos. O que você acha, quais dos novos recursos ganharão o amor da comunidade?

All Articles