Article image

WS

Walberg Santos28/02/2023 09:13
Compartilhe

Inferência de tipo de variável local em Java

  • #Java

Para quem já conhece Java bem sabe que diferentemente de outras linguagens de programação, como Python e Javascritp, ele é, historicamente, fortemente tipado. Isso significa que ele requer uma declaração explícita do tipo de cada objeto e variável, ou seja, precisamos identificar o tipo de dado no momento de sua declaração. Em termos práticos, para declararmos uma lista de strings precisamos proceder da seguinte forma:

List<String> diasSemana = new ArrayList<String>();

 Do mesmo modo para os dados primitivos e literais, bem como nos loops:

// Dados primitivos
int idade = 25;
double altura = 1.79;

// Wrappers
Boolean const = false;
Character sexo = 'F';

// Laço for
for (int contador=0; contador<10; contador++){...}
for (String nome : List<String> nomes {...}

Perceba que identificamos o tipo de dado logo no início e, as vezes, em mais de um ponto da declaração, por exemplo, quando é o caso de uso do diamond operator (generics). No entanto, objetivando deixar o código mais legível e resolver parte dos problemas de boilerplate code, no JDK 10 e versões posteriores, foi implementada a inferência de tipo de dados a partir do identicador var. O efeito prático desse novo recuros reside na forma como podemos escrever nossos códigos. Usando o identificador var, o tipo da variável é inferida a partir do tipo do inicializador. Por exemplo, podemos reescrever nosso ArrayList de string declarado acima da seguinte forma:

var diasSemana = new ArrayList<>();

Do mesmo modo podemos fazer as demais alterações de tipo:

var idade = 25;
var altura = 1.79;
var const = false;
var sexo = 'F';

for (var contador=0; contador<10; contador++){...}
for (var nome : List<String> nomes {...}

try (Stream<Customer> result = dbconn.executeQuery(query)) {
return result.map(...)
       .filter(...)
       .findAny();
}

// usando inferência
try (var customers = dbconn.executeQuery(query)) {
return customers.map(...)
        .filter(...)
        .findAny();
}

Com o var, embora haja divergências, podemos melhorar a leitura do código, principalmente evitando a declaração redundante do tipo de variável. Porém o seu uso possui algumas limitações. Não pode ser usado como parâmentro e nem como tipo de retorno de métodos, bem como não pode ser utilizado como atributos de classe nem como argumento no construtor. Para não errar, tenha em mente que o var é dedicado para o uso com variáveis locais inicializáveis.

// forma errada de uso do var
public static void mudarNome(var nome) {
 this.nome = nome;
}

public var getName() {...}

public class Teste {
 private var nome;
 private var idade;
 private var cpf;

 public Teste (var name, var idade, var cpf) {...}

Bons estudos!!!

Referências

Local Variable Type Inference. Oracle. Disponível em: https://docs.oracle.com/en/java/javase/13/language/local-variable-type-inference.html. Acesso em: 27, fev. de 2023.

Compartilhe
Comentários (1)

LJ

Luciano Junior - 28/02/2023 10:50

Ótimo conteúdo, muito esclarecedor.

O identificador var deve ser utilizado com prudência, uma vez que seu uso exagerado pode ter resultado contrário ao pretendido.