Después de seis meses de desarrollo, la empresa Oracle plataforma (Java Platform, Standard Edition 15), que utiliza como implementación de referencia el proyecto abierto OpenJDK. Java SE 15 mantiene la compatibilidad hacia atrás con las versiones anteriores de la plataforma Java, todos los proyectos Java escritos anteriormente funcionarán sin cambios al ejecutarse en la nueva versión. Las versiones listas para instalar de Java SE 15 (JDK, JRE y Server JRE) para Linux (x86_64), Windows y macOS. Implementación de referencia desarrollada en el marco del proyecto OpenJDK está completamente abierta bajo la licencia GPLv2 con excepciones de GNU ClassPath, que permiten el enlace dinámico con productos comerciales.
Java SE 15 se clasifica como una versión de soporte estándar, y las actualizaciones se lanzarán hasta la próxima versión. Se debe utilizar Java SE 11 como rama de soporte a largo plazo (LTS), las actualizaciones de la cual se lanzarán hasta 2026. La anterior rama LTS, Java 8, se mantendrá hasta diciembre de 2020. La próxima versión LTS está programada para septiembre de 2021. Cabe recordar que a partir de la versión Java 10, el proyecto adoptó un nuevo proceso de desarrollo, implicando un ciclo de lanzamiento más corto. La nueva funcionalidad ahora se desarrolla en una rama master que se actualiza continuamente, integrando los cambios listos y de la que se bifurcan ramas cada seis meses para estabilizar nuevas versiones.
De :
- soporte para el algoritmo de creación de firmas digitales EdDSA (Edwards-Curve Digital Signature Algorithm ). La implementación propuesta de EdDSA no depende de plataformas de hardware, es resistente a ataques por canales laterales (garantizando un tiempo de ejecución constante en todos los cálculos) y superó en rendimiento a la implementación existente de ECDSA, escrita en C, manteniendo el mismo nivel de seguridad. Por ejemplo, EdDSA utilizando una curva elíptica con una clave de 126 bits demuestra un rendimiento similar al de ECDSA con la curva elíptica secp256r1 y una clave de 128 bits.
- soporte experimental para clases e interfaces selladas ('sealed'), que no pueden ser utilizadas por otras clases e interfaces para la herencia, extensión o sobreescritura de implementación. Las clases selladas también ofrecen una manera más declarativa de restringir el uso de la superclase, en comparación con los modificadores de acceso, basándose en la enumeración explícita de las subclases permitidas para la extensión.
package com.example.geometry;
public sealed class Shape
permits com.example.polar.Circle,
com.example.quad.Rectangle,
com.example.quad.simple.Square {…} - soporte para clases ocultas que no pueden ser utilizadas directamente por el bytecode de otras clases. El objetivo clave de las clases ocultas es su uso en marcos que generan dinámicamente clases en tiempo de ejecución y las utilizan indirectamente a través de . Tales clases generalmente tienen un ciclo de vida limitado, por lo que su mantenimiento para el acceso desde clases generadas estáticamente no está justificado y solo resultará en un aumento del consumo de memoria. Las clases ocultas también permiten prescindir de la API no estándar sun.misc.Unsafe::defineAnonymousClass, que está programada para ser eliminada en el futuro.
- Se ha estabilizado y se ha considerado listo para el uso general el recolector de basura ZGC (Z Garbage Collector). ZGC opera en modo pasivo, minimizando lo más posible las demoras debidas a la recolección de basura (el tiempo de detención al usar ZGC no excede los 10 ms) y puede trabajar tanto con montones pequeños como con grandes montones, que varían desde varios cientos de megabytes hasta varios terabytes.
- Se ha estabilizado y se ha considerado listo para el uso general
recolector de basura , que funciona con mínimas interrupciones (Low-Pause-Time Garbage Collector). Shenandoah fue desarrollado por Red Hat y es notable por utilizar un algoritmo que reduce el tiempo de detenciones durante la recolección de basura al realizar la limpieza paralelamente con la ejecución de aplicaciones Java. El tamaño de las interrupciones causadas por el recolector de basura es predecible y no depende del tamaño del montón, es decir, para montones de 200 MB y 200 GB las interrupciones serán idénticas ( los 50 ms y generalmente se ajustan a 10 ms); - Se ha estabilizado y se ha introducido en el lenguaje el soporte — una nueva forma de literales de cadena que permite incluir en el código fuente datos de texto multilineales sin necesidad de escapar caracteres y preservando el formato original del texto en el bloque. El bloque se delimita con tres comillas dobles.
Por ejemplo, en lugar de código
String html = «<HTML>» +
«\n\t» + «<BODY>» +
«\n\t\t» + «<H1>\»Java 15 is here!\»<\/H1>» +
«\n\t» + «<\/BODY>» +
«\n» + «<\/HTML>»;se puede especificar:
String html = «»»
<HTML>
<BODY>
<H1>»Java 15\
is here!»<\/H1>
<\/BODY>
<\/HTML>»»»; - API Legacy DatagramSocket. Las antiguas implementaciones de java.net.DatagramSocket y java.net.MulticastSocket han sido reemplazadas por una implementación moderna, más fácil de depurar y mantener, y que también es compatible con los hilos virtuales desarrollados en el marco del proyecto. . Para evitar posibles problemas de compatibilidad con el código existente, la implementación antigua no se ha eliminado y puede ser activada mediante la opción jdk.net.usePlainDatagramSocketImpl.
- Se ha propuesto una segunda implementación experimental. 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();
} - segunda implementación experimental de la palabra clave «», 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).
- segundo borrador preliminar de la API Foreign-Memory Access, 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.
- y se ha declarado obsoleta la técnica de optimización Biased Locking, utilizada en HotSpot JVM para reducir los costos de las bloqueos. Esta técnica ha perdido relevancia en sistemas con instrucciones atómicas provistas por CPUs modernos, siendo también muy laboriosa de mantener debido a su complejidad.
- obsoleto el mecanismo , que se eliminará en una de las próximas versiones. Se señala que RMI Activation ha quedado obsoleto, clasificado como opción desde Java 8 y rara vez se utiliza en la práctica moderna.
- motor de JavaScript , que fue declarado obsoleto en Java SE 11.
- puertos para el sistema operativo Solaris y procesadores SPARC (Solaris/SPARC, Solaris/x64 y Linux/SPARC). La eliminación de estos puertos permitirá a la comunidad acelerar el desarrollo de nuevas funcionalidades de OpenJDK, sin perder tiempo en mantener características específicas de Solaris y SPARC.
Fuente: opennet.ru
