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.