Lanzamiento de Java SE 17

Después de seis meses de desarrollo, Oracle lanzó Java SE 17 (Java Platform, Standard Edition 17), que utiliza el proyecto de código abierto OpenJDK como implementación de referencia. Con la excepción de la eliminación de algunas características obsoletas, Java SE 17 mantiene la compatibilidad con versiones anteriores de la plataforma Java; la mayoría de los proyectos Java escritos anteriormente funcionarán sin cambios cuando se ejecuten con la nueva versión. Las compilaciones listas para instalar de Java SE 17 (JDK, JRE y Server JRE) están preparadas para Linux (x86_64, AArch64), Windows (x86_64) y macOS (x86_64, AArch64). Desarrollada por el proyecto OpenJDK, la implementación de referencia de Java 17 es completamente de código abierto bajo la licencia GPLv2, con excepciones GNU ClassPath que permiten enlaces dinámicos con productos comerciales.

Java SE 17 está clasificada como una versión de soporte a largo plazo (LTS), que seguirá recibiendo actualizaciones hasta 2029. Se han descontinuado las actualizaciones para la versión anterior de Java 16. La rama LTS anterior de Java 11 será compatible hasta 2026. El próximo lanzamiento de LTS está previsto para septiembre de 2024. Recordemos que a partir del lanzamiento de Java 10, el proyecto pasó a un nuevo proceso de desarrollo, lo que implica un ciclo más corto para la formación de nuevas versiones. Ahora se desarrolla nueva funcionalidad en una rama maestra constantemente actualizada, que incluye cambios ya hechos y desde la cual las ramas se ramifican cada seis meses para estabilizar las nuevas versiones.

Las nuevas características de Java 17 incluyen:

  • Se propone una implementación experimental de coincidencia de patrones en expresiones de “cambio”, que permite utilizar no valores exactos en etiquetas de “caso”, sino plantillas flexibles que cubren una serie de valores a la vez, para lo cual antes era necesario utilizar engorrosos cadenas de expresiones "si... si no". Además, "switch" tiene la capacidad de manejar valores NULL. Objeto o = 123L; Cadena formateada = cambiar (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); caso Doble d -> String.format("doble %f", d); caso Cadena s -> String.format("Cadena %s", s); predeterminado -> o.toString(); };
  • Soporte estabilizado para clases e interfaces selladas, que no pueden ser utilizadas por otras clases e interfaces para heredar, ampliar o anular la implementación. Las clases selladas también proporcionan una forma más declarativa de restringir el uso de una superclase que los modificadores de acceso, basándose en una lista explícita de las subclases permitidas para la extensión. paquete com.ejemplo.geometría; clase pública sellada La forma permite com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
  • Se propone una segunda vista previa de Vector API, que proporciona funciones para cálculos vectoriales que se ejecutan utilizando instrucciones vectoriales en procesadores x86_64 y AArch64 y permiten aplicar operaciones simultáneamente a múltiples valores (SIMD). A diferencia de las capacidades proporcionadas en el compilador HotSpot JIT para la vectorización automática de operaciones escalares, la nueva API permite controlar explícitamente la vectorización para el procesamiento de datos paralelo.
  • Se agregó una vista previa de la API de memoria y funciones externas, que permite que las aplicaciones interactúen con código y datos fuera del tiempo de ejecución de Java. La nueva API le permite llamar de manera eficiente a funciones que no son JVM y acceder a memoria no administrada por JVM. Por ejemplo, puede llamar funciones desde bibliotecas compartidas externas y acceder a datos de procesos sin utilizar JNI.
  • El motor de renderizado de macOS que impulsa la API Java 2D, que a su vez impulsa la API Swing, se ha adaptado para utilizar la API de gráficos Metal. La plataforma macOS continúa usando OpenGL de forma predeterminada y para habilitar la compatibilidad con Metal es necesario configurar "-Dsun.java2d.metal=true" y ejecutar al menos macOS 10.14.x.
  • Se agregó un puerto para la plataforma macOS/AArch64 (computadoras Apple basadas en los nuevos chips Apple M1). Una característica especial del puerto es la compatibilidad con el mecanismo de protección de memoria W^X (Write XOR Execute), en el que no se puede acceder simultáneamente a las páginas de memoria para escritura y ejecución. (El código se puede ejecutar solo después de deshabilitar la escritura, y escribir en una página de memoria solo es posible después de deshabilitar la ejecución).
  • Se volvió a usar solo semántica estricta de fp para expresiones de punto flotante. Se suspendió el soporte para la semántica "predeterminada", disponible desde el lanzamiento de Java 1.2, incluidas simplificaciones para trabajar en sistemas con coprocesadores matemáticos x87 muy antiguos (después de la llegada de las instrucciones SSE2, la necesidad de semántica adicional desapareció).
  • Se han implementado nuevos tipos de interfaces para generadores de números pseudoaleatorios y se han implementado algoritmos adicionales para una mejor generación de números aleatorios. Las aplicaciones tienen la oportunidad de elegir un algoritmo para generar números pseudoaleatorios. Soporte mejorado para generar flujos de objetos aleatorios.
  • Se impuso una encapsulación estricta de todos los componentes internos del JDK, con la excepción de las API críticas como sun.misc.Unsafe. La encapsulación estricta bloquea los intentos del código de acceder a clases, métodos y campos internos. Anteriormente, el modo de encapsulación estricta se podía desactivar usando la opción "--illegal-access=permit", pero ahora esto ha quedado obsoleto. Las aplicaciones que requieren acceso a clases, métodos y campos internos deben definirlos explícitamente usando la opción --add-opens o el atributo Add-Opens en el archivo de manifiesto.
  • Las aplicaciones tienen la capacidad de definir filtros de deserialización de datos, que pueden ser sensibles al contexto y seleccionarse dinámicamente en función de operaciones de deserialización específicas. Los filtros especificados son aplicables a toda la máquina virtual (en toda la JVM), es decir. cubren no solo la aplicación en sí, sino también las bibliotecas de terceros utilizadas en la aplicación.
  • Swing ha agregado el método javax.swing.filechooser.FileSystemView.getSystemIcon para cargar íconos grandes y mejorar la interfaz de usuario en pantallas de alto DPI.
  • La API java.net.DatagramSocket brinda soporte para conectarse a grupos de multidifusión sin la necesidad de una API java.net.MulticastSocket separada.
  • Se ha mejorado la utilidad IGV (Ideal Graph Visualizer), que proporciona visualización interactiva de la representación del código intermedio en el compilador HotSpot VM C2 JIT.
  • En JavaDoc, por analogía con el compilador javac, cuando se genera un error, ahora se indica el número de la línea problemática en el archivo fuente y la ubicación del error.
  • Se agregó la propiedad nativa.encoding, que refleja el nombre de la codificación de caracteres del sistema (UTF-8, koi8-r, cp1251, etc.).
  • Se ha agregado la interfaz java.time.InstantSource, lo que permite la manipulación de la hora sin referencia a una zona horaria.
  • Se agregó la API java.util.HexFormat para convertir a representación hexadecimal y viceversa.
  • Se ha agregado un modo de agujero negro al compilador, que deshabilita las operaciones de eliminación de código muerto, que se puede utilizar al realizar pruebas de rendimiento.
  • Se agregó la opción "-Xlog:async" al tiempo de ejecución para registrar registros en modo asíncrono.
  • Al establecer conexiones seguras, TLS 1.3 está habilitado de forma predeterminada (anteriormente se usaba TLS 1.2).
  • La API de Applet anteriormente declarada obsoleta (java.applet.Applet*, javax.swing.JApplet), que se utilizaba para ejecutar aplicaciones Java en el navegador, se ha movido a la categoría de eliminación programada (perdió relevancia después del fin del soporte). para el complemento Java para navegadores).
  • Security Manager, que hace tiempo que perdió su relevancia y resultó no ser reclamado después de que finalizó el soporte para el complemento del navegador, ha sido trasladado a la categoría de aquellos cuya eliminación está programada.
  • Se eliminó el mecanismo de activación RMI, que está desactualizado, relegado a la categoría de opción en Java 8 y casi nunca se utiliza en la práctica moderna.
  • Un compilador experimental que admite JIT (justo a tiempo) para la compilación dinámica de código Java para HotSpot JVM, así como el modo de compilación anticipada (AOT, antes de tiempo) de clases en código de máquina antes de iniciar la máquina virtual. , se ha eliminado del SDK. El compilador fue escrito en Java y se basó en el trabajo del proyecto Graal. Cabe señalar que el mantenimiento del compilador requiere mucha mano de obra, lo que no se justifica cuando no hay demanda por parte de los desarrolladores.

Fuente: opennet.ru

Añadir un comentario