Java 10: Probando las nuevas funcionalidades
Introducción
Como probablemente ya sabrás, Java 10 se liberó el pasado 20 de marzo siguiendo el nuevo programa para liberar versiones cada 6 meses. Esta versión viene tras el lanzamiento de Java 9 el pasado septiembre de 2017 y deja esta última version obsoleta.
Java 11 se liberará como una versión de soporte prolongado (LTS) y tendrá un periodo de vida mucho más amplio, pero hasta entonces, veamos cuáles son algunas de las nueva funcionalidades en Java 10.
Versionado de lanzamientos basado en tiempo
Java 10 introduce el nuevo versionado basado en tiempo (JEP 322) que es una reestructuración de JEP 223 liberado en Java 9 para permitir el nuevo modelo de lanzamientos. De ahora en adelante los números de versión seguirán este patrón:$FEATURE.$INTERIM.$UPDATE.$PATCH
Cada 6 meses una nueva versión de funcionalidad (feature release) se liberará, cada 3 años (comenzando en septiembre de 2018) la versión de funcionalidad será de soporte prolongado (LTS).
Inferencia en el tipo de variables locales
Java 10 incluye varias funcionalidades nuevas, aunque de todas ellas, probablemente la más aparente para la mayoría de nosotros es JEP 286: Local-Variable Type Inference. Esta funcionalidad mejora la experiencia de desarrollo al eliminar el código adicional, necesario hasta ahora, para declarar variables locales expresando el tipado completo de la variable.
1var shouldBeString = "Hello Java 10";
2assertTrue(String.class.isInstance(shouldBeString));
De ahora en adelante las variables locales podrán declararse empleando la palabra reservada var
, la seguridad de tipado se preservará ya que el tipo de la variable se determinará en el momento en el que se le asigne un valor por primera vez.
De este modo, el siguiente código dará un error de compilación:

Otras funcionalidades incluidas en esta versión
- 296: Consolidate the JDK Forest into a Single Repository (Consolidar la maraña del JDK en un único repositorio)
- 304: Garbage-Collector Interface (Interfaz para el “Recolector de basura”)
- 307: Parallel Full GC for G1 (“Recolección de basura” en paralelo para G1)
- 310: Application Class-Data Sharing (Permitir classes de aplicación en “Class-Data Sharing (CDS)”)
- 312: Thread-Local Handshakes
- 313: Remove the Native-Header Generation Tool (javah) (Eliminar la herramienta javah del JDK)
- 314: Additional Unicode Language-Tag Extensions (Extensiones Unicode Language-Tag adicionales)
- 316: Heap Allocation on Alternative Memory Devices (Asignación de Heap en dispositivos de memoria alternativos)
- 317: Experimental Java-Based JIT Compiler (Compilador Java JIT experimental)
- 319: Root Certificates (Certificados Raíz)
Mejoras en esta versión
Método Optional.orElseThrow()
Se ha creado un método adicional orElseThrow()
en la clase Optional
para reemplazar el método estándar get()
ya que el nombre de éste era confuso y los desarrolladores podrían no esperarse que un “getter” lanzase una excepción. A partir de ahora ésta será la alternativa recomendada, en futuras versiones el método get()
se marcará como obsoleto.
1final Optional<String> optional = Optional.ofNullable("Optional improvement in Java 10");
2final String string = optional.orElseThrow(); // Returns OK
3final Optional<String> optional = Optional.ofNullable(null);
4final String string = optional.orElseThrow(); // Throws NoSuchElementException
Collectors inmodificables
Nuevos métodos toUnmodifiableList()
, toUnmodifiableSet()
y toUnmodifiableMap()
se han añadido a la clase Collectors
para facilitar la creación de colecciones inmodifcables.
1Stream.of(1, 2, 3).collect(Collectors.toUnmodifiableSet());
2Stream.of(1, 2, 3).collect(Collectors.toUnmodifiableList());
3Stream.of(1, 2, 3).collect(Collectors.toUnmodifiableMap(Function.identity(), Function.identity()));
Sourcecode
El código fuente completo de este artículo con tests para las nuevas funcionalidades y mejoras puede encontrarse en GitHub.
