Novedades de Java 15

Escrito por picodotdev el .
java planeta-codigo
Enlace permanente Comentarios

Algunas novedades de anteriores versiones que en la versión de Java 15 pasan a calificarse con el grado de producción y otras características como una segunda versión preliminar. Sin grandes cambios en el lenguaje tan destacables de versiones anteriores como las lambdas de Java 8 o los módulos de Java 9, en Java 15 se añaden las sealed classes.

En septiembre del 2020 se ha publicado la versión 15 de Java siguiendo el calendario propuesto desde la versión de Java 9 de una nueva versión cada seis meses y de una versión de soporte a largo plazo cada tres años, la primera LTS ha sido Java 11 a la que sucederá Java 17 cómo LTS en septiembre de 2021.

Con este calendario de publicaciones tan frecuente las novedades son varias en cada nueva versión aunque algunas son simplemente versiones preliminares que pueden cambiar ligeramente en siguientes versiones destinadas a evaluar y probar las funcionalidades que se incorporarán de forma definitiva con posterioridad. Aunque sean versiones preliminares se pueden usar con normalidad, simplemente hay que tener en cuenta que en versiones posteriores requieran modificaciones en el código fuente o lo que es lo mismo no se garantiza la compatibilidad hacia atrás hasta que sean declaradas como una versión definitiva.

Dado que ahora las versiones de Java son mucho más numerosas y frecuentes se hace más necesario utilizar la herramienta SDKMAN para instalar al mismo tiempo varias versiones del JDK de Java y poder cambiar de una a otra con facilidad.

Esta es la lista de novedades de Java 15, algunas son cambios que no tiene gran impacto en el lenguaje ni la plataforma al ser más cambios internos que reimplementan y modernizan código existente, otras son versiones preliminares y segundas versiones preliminares no definitivas, algunas características en versiones anteriores se marcan como públicas dejando de ser preliminares, otras que se marcan como obsoletas desaconsejándose su uso y otras ya marcadas como obsoletas anteriormente son eliminadas.

Algoritmo de firma digital Edwards-Curve (EdDSA)

El algoritmo de firma digital EdDSA o Edwards-Curve Digital Signature Algorithm (EdDSA) es demandado por mejorar la seguridad y el rendimiento comparado con otros algoritmos de firma, ya está implementado en otras librerías de criptografía como OpenSSL. Este esquema de firma es opcional en TLS 1.3 pero es uno de los tres permitidos. Añadir este algoritmo permite usar EdDSA en Java sin recurrir a librerías de terceras partes.

Sealed Classes (vista previa)

En Java las clases permiten la reutilización de código mediante la herencia, los métodos de una clase son heredados por las subclases que la extiendan. Sin embargo, en ocasiones la jerarquía de clases sirve para modelar el dominio sin querer permitir que sea extendido por cuales quiera otras clases.

En Java toda clase puede ser extendida por defecto la única forma de no permitir extender una clase es utilizando la palabra reservada final. Sin embargo, esto impide la extensión de la clase completamente.

Las clases sealed especifican de forma explícita que clases tiene permitido la extensión y herencia. Las clases sealed son más restrictivas que el comportamiento por defecto de permitir a cualquier clase la extensión pero más permisivo que si se utiliza la palabra clave final que impide a cualquier clase la extensión.

Se introduce una nueva palabra reservada sealed. La declaración de la clase sealed se realiza con el siguiente sintaxis, en este ejemplo la clase Shape solo puede ser extendida por las clases Circle, Rectangle y Square.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public abstract sealed class Shape permits Circle, Rectangle, Square {
    ...
}

public Circle extends Shape {
    ...
}

public Rectangle extends Shape {
    ...
}

public Square extends Shape {
    ...
}
SealedClasses.java

Pattern Matching para instanceof (segunda vista previa)

Se mantiene en la categoría de funcionalidad preliminar esta funcionalidad ya publicada en Java 14 que permite eliminar algunos cast de tipos explícitos.

1
2
3
4
if (obj instanceof String) {
    String s = (String) obj;
    // use s
}
IfPatternMatching-1.java

El operador instanceof permite renombrar la variable y dentro de la rama usarla sin necesidad de realizar el cast, esto simplifica el código y evita posibles errores.

1
2
3
if (obj instanceof String s) {
    // use s
}
IfPatternMatching-2.java

Records (segunda vista previa)

Los records son clases inmutables con unas convenciones implícitas que no requieren escribir mucho del código considerado ceremonial en las clases de datos Java que hacen al lenguaje verboso para estas clases simples.

Escribir clases portadoras de datos en Java requieren una buena cantidad de código de bajo valor, repetitivo, propenso a errores para especificar constructores, métodos de acceso a propiedades e implementar correctamente los métodos equals, hashCode y toString.

La siguiente clase record es equivalente al POJO tradicional de muchas más líneas de código.

1
2
public record PhoneNumber(Integer lineNumber, Integer prefix, Integer areaCode) {
}
Records.java

Bloques de texto

En Java embeber en el código un trozo de código HTML, XML, SQL o JSON en un literal como un String requiere editarlo de forma significativa con caracteres de escape y concatenación para que el código compile. La cadena transformada resultante es poco legible y difícil de mantener.

Un bloque de texto HTML en código Java requeire de mútiples caracteres de escape y concatenaciones de cadenas.

1
2
3
4
5
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, world</p>\n" +
              "    </body>\n" +
              "</html>\n";
TextBlocks-1.java

Usando bloques de texto se eliminan los caracteres de escape y las concatenaciones. El código resultante es mucho más legible y fácil de mantener.

1
2
3
4
5
6
7
String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;
TextBlocks-2.java

Clases ocultas

Se añaden clases oultas o hidden classes que son clases que no pueden usarse directamente por otras clases. Su intención es que sean usadas por frameworks que generan clases en tiempo de ejecución y las usan de forma indirecta con reflection.

Reimplementación de la antigua API DatagramSocket

Se reemplazan las implementaciones de bajo nivel para la comunicación por red java.net.DatagramSocket y java.net.MulticastSocket con una implementación mas simple y moderna que es más fácil de mantener, depurar y fácil de adaptar a los threads virtuales del proyecto Loom.

Recolectores de basura ZGC y Shenandoah

Se califican como versión de producción los recolectores de basura ZGC y Shenandoah que ofrecen tiempos de pausa bajos aunque se mantiene como recolector de basura por defecto G1. Se soportan todas las plataformas comunes, Linux/x86_64, Linux/aarch64, Windows y macOS. El recolector de basura ZGC se activa con la opción de la máquina virtual -XX:+UseZGC y Shenandoah con -XX:+UseShenandoahGC.

Otras características incorporadas y cambios

Otras especificaciones que no tienen tanto impacto desde el punto de vista del programador y en el lenguaje son las siguientes. Algunas eliminan y marcan como desaconsejado su uso.

Entre las más destacables está Foreign-Memory Access que permite a los programas Java acceder de forma segura y eficiente a memoria externa fuera de la memoria heap de Java. También a destacar el soporte de Unicode 13.0 que añade unos 5K nuevos caracteres o el soporte para el algoritmo de hash SHA-3 en el apartado de seguridad.

Comparte el artículo: