Java 10! O que há de novo?

Java 10

A partir do lançamento oficial do Java 9 a Oracle comunicou que a partir dessa versão as novas versões seriam lançadas a cada 6 meses. E realmente isso aconteceu, muitos de nós nem mesmo conseguimos tempo para estudar a fundo os novos recursos do Java 9 e o Java 10 já foi lançado em 20 de Março de 2018 e trouxe algumas mudanças bem significativas para a linguagem.

Local variable type Inference

Algo bastante interessante na versão 10 do Java foi uma nova forma de se declarar variaveis locais. Como bem sabemos, o Java é uma linguagem de programação fortemente tipada, ou seja, na declaração de qualquer variavel é necessário especificar o tipo dessa variavel. Mas com o Java 10 tivemos uma pequena mudança nesse aspecto.

O novo recurso, nomeado como Local variable type Inference, introduz uma nova forma de se declarar variaveis locais com a chegada do Java 10. Vejamos alguns exemplos:

public void exemplos() {
    //Até o Java 9
    Integer i = 9;
    String s = "Java ";
    System.out.println(s + i);

    //Java 10
    var x = 10;
    var y = "Java ";
    System.out.println(y + x);
}

Então, percebeu as diferenças entre as 4 declarações de variaveis locais no método exemplos()? Se sim, você observou que as variaveis x e y não tiveram um tipo definido como Integer ou String e sim uma nova palavra chave, do Java, que é a var.

O que acontece agora é que o próprio compilador consegue definir o tipo da variavel a partir do valor de atribuição. Mas, não se esqueça, isso vale apenas para variaveis locais. Você não vai conseguir declarar variaveis de instancia com var. Por exemplo, o código a baixo não irá compilar:

public class Main {

    private var nome = "Marcio";
    
}

Também não é possível declarar o var como argumento de métodos. O exemplo a seguir lançaria um erro em tempo de compilação:

public void exemplos(var x1, var x2) {

}

Mas você atribuir o retorno de um método para inicializar uma variavel declarada com var. Veja no exemplo a seguir que o método getVersao() retorna um String, o qual será atribuído a variavel versao.

public class Main {

    public static void main(String[] args) {
        Main main = new Main();
        var versao = main.getVersao();
        System.out.println(versao);
    }
    
    public String getVersao() {
        return "Java 10";
    }
}

Outra caracteristica desse novo recurso é que ele só trabalha com declaração direta, caso contrário o código não vai compilar. Observe o exemplo a seguir e perceba que é possível declarar uma variavel String de forma indireta, já a declaração indireta com var não é possível, novamente teríamos um erro em tempo de compilação.

public void exemplo() {
    // compila
    String nome;
    nome = "Java";
    
    // não compila
    var idade;
    idade = 10;
}

Você também pode usar a declaração var para tipos complexos de objetos e não apenas para String, Integer, Long, etc. Confira alguns exemplos a seguir:

public void exemplos() {
    //atribui um ArrayList de String's    
    var nomes = Arrays.asList("Ana", "Bia", "Lú");

    //atribui uma lista de Pessoa's
    var pessoas = dao.findByPessoas();
    
    //atribui um objeto Usuario
    var joao = new Usuario("Joao Luis", 25, 'M');
}

Immutable Collections

Outro recurso interessante lançado no Java 10 é uma nova API para criação de coleções imutaveis. Coleções imutaveis são aquelas criadas e não modificaveis. Um exemplo bastante comum que tinhamos até o Java 9 é o Arrays.asList(), uma forma mais direta de se criar uma lista. Entretanto, após criar uma lista desse tipo, não será possível incluir mais novos valores
a lista. Por isso ela é considerada imutável.

Com o Java 10 as coleções como java.util.Set e java.util.Map também passaram a ter métodos para criação direta e imutavel. Eu particularmente, sentia falta disso em relação ao java.util.Map e gostei bastante desse novo recurso. Veja agora do que se trata:

public void coll() {
    List<String> strings = new ArrayList<>();
    strings.add("Ana Lucia");
    strings.add("Joana");
    strings.add("Pricila");
    strings.add("Bianca");

    var s = Set.copyOf(strings);
    s.forEach(System.out::println);

    var n = Set.of("Bia", "Ana", "Lú", "Jô");
    n.forEach(System.out::println);
    
    var m = Map.of("K1", 1, "K2", 2, "K3", 3);
    m.forEach((k,v) -> System.out.println("Key="+k + " " + "Value="+v));
}

Tanto a interface Set quanto a Map tem agora o método estático copyOf() que recebe como parâmetro uma coleção já existente. Como pode ser visto na declaração da variavel copia. Além disso, essas interfaces possuêm uma lista de método nomeados como of().

Os métodos of() recebem declarações diretas dos valores que se deseja incluir na coleção. Como vemos em set e map. O of() de Map é o caso mais interessante, já que um Map possui uma chave e um valor. Sendo assim, ao usar o método of() o primeiro parâmetro é chave e o segundo o valor. Caso queira incluir mais valores, o terceiro parâmetro será uma nova chave e o quarto parâmetro o valor desta chave e assim por diante.

E agora, vai passar a utilizar esse novo modelo de declaração de variaveis locais? Se sim, lembre-se que este recurso estará disponível apenas se você já instalou o JDK 10.

Referencia

Ballem

Marcio Ballem é bacharel em Sistemas de Informação pelo Centro Universitário Franciscano em Santa Maria/RS. Tem experiência com desenvolvimento Delphi e Java em projetos para gestão pública e acadêmica. Possui certificação em Java, OCJP 6.

Você pode gostar...