Lanzamiento de Java SE 14

Después de seis meses de desarrollo, la empresa Oracle lanzó plataforma Java SE 14 (Java Platform, Standard Edition 14), cuya implementación de referencia utiliza el proyecto de código abierto OpenJDK. Java SE 14 mantiene la compatibilidad hacia atrás con versiones anteriores de la plataforma Java; todos los proyectos Java previamente escritos funcionarán sin modificaciones al ejecutarse en la nueva versión. Construcciones listas para instalar de Java SE 14 (JDK, JRE y Server JRE) preparadas para Linux (x86_64), Windows y macOS. Implementación de referencia desarrollada en el marco del proyecto OpenJDK Java 14 está completamente abierta bajo la licencia GPLv2 con excepciones de GNU ClassPath, que permiten el enlace dinámico con productos comerciales.

Java SE 14 se clasifica como un lanzamiento con un ciclo de soporte normal, con actualizaciones que serán lanzadas hasta el próximo lanzamiento. Para una rama con soporte extendido (LTS), se debe usar Java SE 11, cuyas actualizaciones se lanzarán hasta 2026. La anterior rama LTS, Java 8, se mantendrá hasta diciembre de 2020. El próximo lanzamiento LTS está programado para septiembre de 2021. Recordemos que a partir del lanzamiento de Java 10, el proyecto cambió a un nuevo proceso de desarrollo, que implica un ciclo más corto para la creación de nuevos lanzamientos. La nueva funcionalidad ahora se desarrolla en una rama master que se actualiza continuamente, en la que se incluyen cambios listos y de la cual se bifurcan ramas cada seis meses para estabilizar nuevos lanzamientos.

De novedades Java 14 en marcar:

  • Se ha añadido soporte experimental para coincidencia con el patrón en el operador «instanceof», que permite definir inmediatamente una variable local para acceder al valor verificado. Por ejemplo, se puede escribir directamente «if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}» sin la necesidad de definir explícitamente «String s = (String) obj».

    Antes:

    if (obj instanceof Group) {
    Group group = (Group) obj;
    var entries = group.getEntries();
    }

    Ahora se puede prescindir de la definición «Group group = (Group) obj»:

    if (obj instanceof Group group) {
    var entries = group.getEntries();
    }

  • Se ha añadido soporte experimental para la nueva palabra clave «record», que proporciona una forma compacta para definir clases, permitiendo evitar la definición explícita de varios métodos de bajo nivel, como equals(), hashCode() y toString(), en casos donde los datos se almacenan solo en campos, cuyo comportamiento no cambia. Cuando en la clase se utilizan implementaciones predeterminadas de los métodos equals(), hashCode() y toString(), se puede prescindir de su definición explícita:

    public record BankTransaction(LocalDate date,
    double amount,
    String description) {}

    Esta declaración llevará a la adición automática de las implementaciones de los métodos equals(), hashCode() y toString(), además del constructor y métodos que controlan la modificación de datos (getter).

  • Estandarizado y se ha incluido por defecto el soporte para la nueva forma de expresiones «switch», que no requiere el uso del operador «break», permitiendo combinar etiquetas repetidas y siendo permitido su uso no solo como operador, sino también como expresión.

    var log = switch (event) {
    case PLAY -> «El usuario ha activado el botón de reproducción»;
    case STOP, PAUSE -> «El usuario necesita un descanso»;
    default -> {
    String message = event.toString();
    LocalDateTime now = LocalDateTime.now();
    yield «Evento desconocido » + message +
    » registrado el » + now;
    }
    };

  • Se ha ampliado el soporte experimental de bloques de texto — para la nueva forma de literales de cadena, que permiten incluir en el código fuente datos de texto en múltiples líneas sin necesidad de escapar caracteres y manteniendo el formato original del texto en el bloque. El contorno del bloque se realiza con tres comillas dobles. En Java 14, en los bloques de texto se ha implementado el soporte para la secuencia de escape «\s» para definir un espacio y «\» para concatenar con la siguiente línea (ignorando el salto de línea cuando se necesita imprimir una línea muy larga). Por ejemplo, en lugar de código

    String html = «<HTML>» +
    «\n\t» + «<BODY>» +
    «\n\t\t» + «

    Java 14 está aquí!

    » +
    «\n\t» + «<\/BODY>» +
    «\n» + «<\/HTML>»;

    se puede especificar:

    String html = «»»
    <HTML>
    <BODY>

    »Java 14
    is here!»<\/H1>
    <\/BODY>
    <\/HTML>»»»;

  • Se ha ampliado la información de diagnóstico al producirse excepciones NullPointerException. Si antes el mensaje de error solo hacía referencia al número de línea, ahora detalla cuál de los métodos provocó la excepción. El diagnóstico ampliado se activa por ahora solo al iniciar con la bandera «-XX:+ShowCodeDetailsInExceptionMessages». Por ejemplo, al utilizar esta bandera, la excepción en la línea

    var name = user.getLocation().getCity().getName();

    resultará en el mensaje

    Exception in thread «main» java.lang.NullPointerException: Cannot invoke «Location.getCity()»
    because the return value of «User.getLocation()» is null
    at NullPointerExample.main(NullPointerExample.java:5):5)

    lo que permite entender que el método Location.getCity() no fue invocado, y que User.getLocation() devolvió un valor nulo.

  • Se implementó una versión preliminar de la utilidad jpackage, que permite crear paquetes para aplicaciones Java autoconclusivas (self-contained). Esta utilidad se basa en javapackager de JavaFX y permite formar paquetes en formatos nativos para varias plataformas (msi y exe para Windows, pkg y dmg para macOS, deb y rpm para Linux). Los paquetes incluyen todas las dependencias necesarias.
  • En el recolector de basura G1 se ha agregado un nuevo mecanismo de distribución de memoria que considera las especificaciones del trabajo en grandes sistemas que utilizan la arquitectura NUMA. El nuevo distribuidor de memoria se activa con la bandera «+XX:+UseNUMA» y permite incrementar significativamente el rendimiento en sistemas NUMA.
  • Se añadió API para monitorear eventos en tiempo real JFR (JDK Flight Recorder), por ejemplo, para organizar un monitoreo continuo.
  • Se añadió el módulo jdk.nio.mapmode, que ofrece nuevos modos (READ_ONLY_SYNC, WRITE_ONLY_SYNC) para crear buffers byte mapeados (MappedByteBuffer), que apuntan a memoria no volátil (NVM).
  • Se implementó una versión preliminar de la API de Acceso a Memoria Extranjera, que permite a las aplicaciones Java acceder de forma segura y eficiente a áreas de memoria fuera del montón de Java, manipulando nuevas abstracciones MemorySegment, MemoryAddress y MemoryLayout.
  • Se han declarado puertos obsoletos para el sistema operativo Solaris y procesadores SPARC (Solaris/SPARC, Solaris/x64 y Linux/SPARC) con la intención de eliminar estos puertos en el futuro. Clasificar los puertos mencionados como obsoletos permitirá a la comunidad acelerar el desarrollo de nuevas funcionalidades en OpenJDK, sin perder tiempo en mantener características específicas de Solaris y SPARC.
  • Eliminado el recolector de basura CMS (Concurrent Mark Sweep), que hace dos años fue declarado obsoleto y quedó sin soporte (el recolector de basura G1 ha reemplazado a CMS desde hace tiempo). Además, que el uso obsoleto de la combinación de algoritmos de recolección de basura ParallelScavenge y SerialOld (iniciar con las opciones «-XX:+UseParallelGC -XX:-UseParallelOldGC»).
  • Se ha proporcionado soporte experimental para el recolector de basura ZGC (Z Garbage Collector) en las plataformas macOS y Windows (anteriormente solo se admitía en Linux). ZGC funciona en modo pasivo, minimizando, en la medida de lo posible, las interrupciones debido a la recolección de basura (el tiempo de detención al usar ZGC no supera los 10 ms) y puede trabajar tanto con montones pequeños como con enormes, que van desde varios cientos de megabytes hasta varios terabytes.
  • Eliminados herramientas y API para comprimir archivos JAR utilizando el algoritmo Pack200.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster