Java 10: Probando las nuevas funcionalidades
Introducción
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 nuevas 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 una serie de nuevas funcionalidades, pero para la mayoría de nosotros la más aparente 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.
var shouldBeString = "Hello Java 10";
assertTrue(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
- JEP 296: Consolidate the JDK Forest into a Single Repository (Consolidar la maraña del JDK en un único repositorio)
- JEP 304: Garbage-Collector Interface (Interfaz para el “Recolector de basura”)
- JEP 307: Parallel Full GC for G1 (“Recolección de basura” en paralelo para G1)
- JEP 310: Application Class-Data Sharing (Permitir classes de aplicación en “Class-Data Sharing (CDS)”)
- JEP 312: Thread-Local Handshakes
- JEP 313: Remove the Native-Header Generation Tool (javah) (Eliminar la herramienta javah del JDK)
- JEP 314: Additional Unicode Language-Tag Extensions (Extensiones Unicode Language-Tag adicionales)
- JEP 316: Heap Allocation on Alternative Memory Devices (Asignación de Heap en dispositivos de memoria alternativos)
- JEP 317: Experimental Java-Based JIT Compiler (Compilador Java JIT experimental)
- JEP 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.
final Optional<String> optional = Optional.ofNullable("Optional improvement in Java 10");
final String string = optional.orElseThrow(); // Returns OK
final Optional<String> optional = Optional.ofNullable(null);
final 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.
Stream.of(1, 2, 3).collect(Collectors.toUnmodifiableSet());
Stream.of(1, 2, 3).collect(Collectors.toUnmodifiableList());
Stream.of(1, 2, 3).collect(Collectors.toUnmodifiableMap(Function.identity(), Function.identity()));
Código fuente
El código fuente completo de este artículo con tests para las nuevas funcionalidades y mejoras puede encontrarse en GitHub.