Hola comunidad, desde el 20 de marzo de este año los seguidores de #Java tenemos disponible el JDK 10, muy esperado a decir verdad, pues marca una pauta en la forma en que se desarrolla y libera Java.

A partir de esta versión el proceso de liberación de actualizaciones va a ser más rápido, así como la evolución del lenguaje, si bien el tránsito de Java 7 a Java 8 tomó su tiempo, las próximas versiones van a llegar con más prontitud. Ya Oracle tiene estimada una fecha para la liberación del JDK 11, que promete ser un LTS con soporte hasta 2026.

Las novedades de esta release se enfocan en la integración con Docker, mejor conexión con los containers y una interface para gestionar el garbage collector; para quienes no están familiarizados con los téminos, esto puede parecer magia negra o no resultar útil, pero hay una característica que atrae el interés de los usuarios del lenguaje, y es el uso de la palabra reservada var, que es sin dudas lo que más destaca y representa a esta nueva versión.

¿Qué es var?
Esta nueva palabra reservada se emplea para lograr la inferencia de tipos en variables locales, explicado de manera breve: permite al compilador obtener el tipo estático sin que se haga necesario escribirlo de forma explícita.

No es una característica nueva dentro de la programación, ha existido durante mucho tiempo dentro de otros lenguajes, y el alcance que puede tener dentro de Java es limitado, se asemeja mucho al uso de la misma palabra dentro de C#(CSharp), y como una imagen vale más que mil palabras, vamos al código.

Pongamos un ejemplo práctico y común, vamos a crear un Scanner, en Java 8 sería algo como:
Scanner entrada = new Scanner(System.in);

Usando var nos ahorramos la repetición del nombre de la clase que estamos instanciando, y quedaría así:
var entrada = new Scanner(System.in);

Y lo usamos de la misma forma en la creación de cualquier objeto:
//Java 8
ArrayList<Integer>numeros = new ArrayList<>();
//Java 10
var numeros = new ArrayList();

Incluso podemos dejar el operador de diamante vacío, sin especificar el tipo de objetos de una colección, u omitirlo.

¿Muy cómodo verdad? Pero no olvidemos las restricciones de uso, como dice el nombre está pensado para variables en contextos locales, digamos dentro de métodos.

  • No se puede inicializar en null, pues en Java null no es un tipo, por tanto:
    var nada = null;
    está mal, sin embargo, sí puede tomar el valor null, un vez que fue evaluado su tipo, por ejemplo:
    var pila = new Stack();

    pila = null;

    es un fragmento de código válido.

  • Se pueden inferir variables inicializadas de tipos String, char, long, float, double, int, y boolean, para el caso de byte y short se debe hacer una declaración explícita o emplear un casteo.
  • Para los arreglos también tenemos que especificar el tipo de dato:
    //Incorrecto
    var arregloEnteros = {1,2,3,4,5,6};
    //Correcto
    var arregloEnteros = new int[]{1,2,3,4,5,6};
  • No le podemos asignar lambdas, pues una función lambda por sí misma no tiene un tipo definido.
  • Y para nada lo podemos usar en variables de clase o sin asignar:
    //Imposible!
    public class Persona{
    private var nombre;
    private var edad;
    ...
    }

Conclusión:
La inferencia de tipos en variables locales va a impactar de manera positiva e inmediata sobre nuestro código: de cierto modo acelera el proceso de codificación, pues elimina el ritual clásico de la repetición de nombres de clase a la hora de crear un objeto, y para quienes lean nuestro código, sino hemos puesto a las variables nombres que hagan imposible seguir el flujo del programa, pues el código fuente será mucho más legible y fácil de entender y mantener.

Espero les haya gustado el artículo y les resulte útil, los sigo en los comentarios.

Happy coding!