Java es un lenguaje que ha cambiado mas en los últimos meses que durante los últimos 22 años que tiene de vida. Es claro que el equipo que lo define y desarrolla esta comprometido con no dejarlo morir y han diseñado un nuevo modelo de entrega continua en el que sacaran una nueva versión cada 6 meses. Con esto se busca mantener el lenguaje con características útiles y compatibles al día de hoy (ajem! docker) así como también desarrollar cosas que gusten a la comunidad.

La inferencia de tipos es una característica que tienen casi todos los lenguajes de programación que usan llaves y tipos estáticos, como por ejemplo C# (var), Scala (var/val) o incluso Go (:=); y no es mas que la opción que los lenguajes le dan a los desarrolladores de inferir el tipo de la variable que se esta trabajando. Vamos en otras palabras, el lenguaje adivina que estas queriendo decir.

así pues si tenemos las siguientes expresiones:

var list = new ArrayList<String>(); 
var stream = list.stream();

Java automáticamente infiere (deduce o adivina) que list es de tipo ArrayList<String> y que stream es de tipo Stream<String>. Entonces la inferencia de tipos funciona a muchos niveles, pero con un gran poder viene una gran responsabilidad, ya que entre mas libertades da un lenguaje mas fácil es que los programadores adopten malas practicas.

Por ejemplo, existe un número de operaciones riesgosas en las cuales se podría caer con esto de la inferencia de tipos.

Variables Sin inicializar

se imaginaran si nosotros decimos:

var x;

Es una sintaxis válida, sin embargo, java no sabrá qué hacer con ella dado que no puede inferir el tipo de algo que no tiene un valor aún. La idea es hacer que el tipo sea consistente en todo el código,  imaginen que en una función x hará las veces de String, en otra de Date y en otra de Long (como en javascript).

Expresiones lambda sin tipo objetivo

Por un principio similar al anterior a una función lambda se le puede inferir el tipo siempre y cuando esta diga que tipo es el objetivo.

var f = () -> { };
var m = this::l;

Null no es inferible

Pues eso, no podemos inferir que tipo es null.

var g = null;

Los tipos inferidos no son denotables

Imaginen el lío si l() fuera void.

var c = l();

Los arreglos necesitan un tipo explícito

Cuando definimos arrays en java 10, no podemos inferir el tipo si lo hacemos de la forma abreviada. Es decir la inferencia no sería type-safe en este caso.

var k = { 1 , 2 };

En conclusión, es nuestra responsabilidad como desarrolladores escribir código legible dentro de nuestros proyectos. La inferencia de tipos puede ser muy útil como también puede volver nuestro código ilegible y difícil de mantener. Es necesario que los equipos que decidan adoptar esta característica tengan convenciones del lenguaje sanas y entendibles. Y sobre todo que no se caiga en los escenarios riesgosos que he descrito en este post.

 

 

 

Categorized in: