¿Qué hay de nuevo en Java 14?
La nueva JDK 14 trae 16 nuevas mejoras o características, algunas con más impacto que otras:
- Pattern Matching for instanceof (Preview)
- Packaging Tool (Incubator)
- NUMA-Aware Memory Allocation for G1
- JFR Event Streaming
- Non-Volatile Mapped Byte Buffers
- Helpful NullPointerExceptions
- Records (Preview)
- Switch Expressions (Standard)
- Deprecate the Solaris and SPARC Ports
- Remove the Concurrent Mark Sweep (CMS) Garbage Collector
- ZGC on macOS
- ZGC on Windows
- Deprecate the ParallelScavenge + SerialOld GC Combination
- Remove the Pack200 Tools and API
- Text Blocks (Second Preview)
- Foreign-Memory Access API (Incubator)
JEP 305: Pattern Matching for instanceof (Preview)
Una de las mejoras de esta versión 14 de Java es la introducción de pattern matching para el operador instanceof. Pattern matching lo que nos permite es lógica común en los progamas, es decir, la extracción condicional de componentes de los objetos para que se pueda expresar o escribir de una forma más precisa, concisa y entendible. Vamos a explicarlo mejor con un ejemplo:
Seguro que todos estamos familiarizados con la expresión de abajo, en el verificamos si un objeto es de tipo String, y en tal caso realizamos una serie de acciones.
if (obj instanceof String) { String s = (String) obj; // use s }
Esta forma de verificar el tipo de objeto es un poco repetitivo por lo que en este caso y gracias a esta versión podríamos aplicar Pattern Matching sobre este objeto:
if (obj instanceof String s && s.length() > 5) { .. s.contains(..) .. }
JEP 343: Packaging Tool (Incubator)
Desde la versió JDK 11 el sistema de javapackager que se encontraba desde la versión 8, no ha estado disponible. Con esta nueva funcionalidad, se pretende que todas las aplicaciones Java pueda ser instaladas como cualquier otro programa .
- Va a soportar formatos msi y exe para Windows, pkg y dmg para macOS y deb and rpm para Linux.
- Va a permitir parámetros al arrancar que serán especificados en el momento de empaquetar.
- Podrá ser invocado directamente desde línea de comando o de manera programatica através de ToolProvider API.
JEP 345: NUMA-Aware Memory Allocation for G1
Procesadores multi core son ahora el standard de facto en prácticamente en cualquier sistema. En una arquitectura NUMA (Non-uniform memory access), cada core recibe una pequeña de memoria local, pero los otros cores puede acceder a ellos. JEP 345 planea equipar al recolector de basura G1 con la posibilidad de utilizar dichas arquitecturas de manera ventajosa. Entre otras cosas, esto está destinado a aumentar el rendimiento en máquinas muy potentes.
JEP 345 sirve únciamente para la implementacion de NUMA para recolector de basura (garbage collector) G1, solo para la gestión de memoria y también exclusivamente bajo Linux.
JEP 349: JFR Event Streaming
Java Flight Recorder (JFK) forma parte ahora del OpenJDKExpose JDK Flight Recorder data for continuous monitoring. JEP 349, crea un API la cual se pueda usar para monitorizar aplicaciones activas o inactivas.
Además permitirá que la transmisión de eventos coexista con grabaciones sin transmisión, tanto en disco como en memoria.
JEP 352: Non-Volatile Mapped Byte Buffers
EP 352 extiende MappedByteBuffer , la cual tiene la característica de extender el acceso a la memoria no volatil (NVM). Esta nueva funcionalidad ha acarreado un nuevo módulo en la JDK, jdk.nio.mapmode, que nos permitirá crear el MappebByteBuffer que será mapeado o en fichero o en memoria no volátil.
La clase ManagementFactory nos permite obtener una lista de BufferPoolMXBean usando el método getPlatformMXBeans, esto se modifica para que capture ciertas estadísticas para todas las instancias de MappedByteBuffer asignadas por el módulo anterior.
JEP 358: Helpful NullPointerExceptions
Por mucho cuidado que se tenga desarrollando, y por más que se verifique todo, siempre podemos tener algún odioso NullPointerException (NPE), en esta versión de Java 14 se ha hecho un esfuerzo en ayudar al desarrollador en, mediante un análisis del bytcode, mostrar que variable puede mostrar un valor null. Además se proporcionará una mayor información sobre este tipo de errores.
JEP 359: Records
Es un nuevo tipo llamado record. Al igual que una enumeración, un registro es una forma restringida de clase; declara su representación y se compromete con una API que coincida con esa representación.
record Coordenada(int x, int y) { }
Records, like enums, are classes. The record declaration can have most of the things class declarations can: accessibility modifiers, Javadoc, annotations, an implements clause, and type variables (though the record itself is implicitly final.) The component declarations can have annotations and accessibility modifiers (though the components themselves are implicitly private and final). The body may contain static fields, static methods, static initializers, constructors, instance methods, instance initializers, and nested types.Brian Goetz
JEP 361: Switch Expressions (Standard)
Esta ampliación del switch puede ser usado como declaración o como sentencia, estos cambios se iniciaron en las versiones JDK 12 y 13, aunque no es hasta ahora con la versión 14, con la mejor introducida de Pattern Matching (ver primer punto) en donde vamos a ver una mejora y simplificación en el uso del switch.
Típica forma de usar el switch:
switch (day) { case MONDAY: case FRIDAY: case SUNDAY: System.out.println(6); break; case TUESDAY: System.out.println(7); break; case THURSDAY: case SATURDAY: System.out.println(8); break; case WEDNESDAY: System.out.println(9); break; }
switch (day) { case MONDAY, FRIDAY, SUNDAY -> System.out.println(6); case TUESDAY -> System.out.println(7); case THURSDAY, SATURDAY -> System.out.println(8); case WEDNESDAY -> System.out.println(9); }
Y arriba podemos ver la nueva forma de hacer uso del switch. También algo nuevo que se incorpora es poder utilizarlo como una expresión:
static void howMany(int k) { System.out.println( switch (k) { case 1 -> "one"; case 2 -> "two"; default -> "many"; } ); }
JEP 362: Deprecate the Solaris and SPARC Ports
El sistema operativo Solaris, sigue siendo parte de Sun Microsystems, y realmente ya no se somete a ninguna actualización. En consecuencia, el deseo de Oracle esp marcar los puertos para Solaris / SPARC, Solaris / x64 y Linux / SPARC como obsoletos e ir eliminandolos en las siguientes versiones.
JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
El Concurrent Mark Sweep Garbage Collector, fue ya deprecado su uso en la JDK9, y ahora con la release de esta versión ha sido definitivamente eliminado. Los recolectores que surgieron nuevos, una vez que fue marcado para su eliminación, fueron ZGC y Shenandoah.
JEP 364: ZGC on macOS
El objetivo de esta mejora es poder proporcionar el Z Garbage Collector como una opción para los usuarios de macOS.
JEP 365: ZGC on Windows
Al igual que la mejora JEP 364, con la única diferencia que es para poder proporcionar el Z Garbage Collector a los usuarios de windows.
JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination
Esta mejora también trata sobre el Garbage Collector, en este caso consiste en marcar como deprecado la combianción de ParalleScavenge y SerialOld, ya que la combinación de estos dos Garbage Collector suponía bastante esfuerzo.
JEP 367: Remove the Pack200 Tools and API
El Pack200 de compresión el cual ha sido usado para la compresión de JAR, el cual fue marcado para su eliminación en la versión 11 de Java, ha sido eliminado en esta versión.
JEP 368: Text Blocks (Second Preview)
En la versión anterior ya se llevo como una característica futura el texto en bloque. Esta nueva característica ha añadido una nueva secuencia de escapes a los textos en bloque.
Hasta la versión 14 de Java para escribir un bloque era:
String literal = "Lorem ipsum dolor sit amet, consectetur adipiscing "+"elit, sed do eiusmod tempor incididunt ut labore "+"et dolore magna aliqua.";
A partir de la versión 14, se ha añadido «/» para poder expresar el fin de la línea.
String text = """ Lorem ipsum dolor sit amet, consectetur adipiscing \ elit, sed doeiusmod tempor incididunt ut labore \ et dolore magna aliqua.\ """;
Y el otro nuevo escape que se ha incluido es el «/s» al final de la línea para dejar un único espacio en blanco
JEP 370: Foreign-Memory Access API (Incubator)
Hay muchas librerías que acceden a la Foreign Memory, como algunas caches, como ignite, memcached, mapDB etc, pero el problema es que la API de Java no nos ofrece una muy buena manera de hacer esto, por eso a partir de esta versión de Java se han realizado una serie de mejoras para poder acceder de manera segura y eficiente a la Foreign Memory que esta alojada fuera del Java Heap.
Estas son algunas de las nuevas mejoras que ha traído la nueva versión de Java, algunas más novedosas como la inclusión del Pattern Matching, y otras que han venido a confirmar lo que en las versiones anteriores se había marcado como la eliminación de Garbages Collector.