Los JEP entregados en Java 17 van desde nuevas funciones de lenguaje hasta mejoras para bibliotecas principales, vistas previas e incubadoras.
Hay algo en Java 17 para todos. ¿Quieres nuevas funciones de idioma? Consulte las clases selladas y la vista previa de coincidencia de patrones para cambiar
. ¿Busca una mayor seguridad? JDK 17 ofrece filtros de deserialización específicos del contexto. ¿Te importan las nuevas plataformas? Ahora hay una versión del JDK para Mac de 64 bits con la arquitectura ARM AArch64. ¿Qué tal años de estabilidad? Java SE 17 es una versión de soporte a largo plazo (LTS), al igual que Java 11 y Java 8.
Oficialmente, el cumpleaños de Java 17 (es decir, cuando está disponible en general) es el 14 de septiembre de 2021, pero sus 14 JEP han sido visibles, por supuesto, durante meses. Los desarrolladores han estado jugando con el código fuente y ejecutando los binarios, y muchos han contribuido con comentarios, informes de errores y sugerencias.
Para obtener detalles técnicos sobre Java 17 y cada uno de sus JEP, consulte los siguientes recursos:
- La publicación oficial del blog de Java: La llegada de Java 17
- El comunicado de prensa oficial de Oracle
- La página de recursos de JDK 17, que enlaza con los JEP
- Las notas de la versión de JDK 17
- Plataforma Java SE 17 (JSR 392)
- La especificación del lenguaje Java, Java SE 17 edición
- La especificación de la máquina virtual de Java, Java SE 17 edición
- Especificación de la API de Java 17
- Diferencias de API entre Java SE 16 y Java SE 17
Java 17 también es una versión LTS, lo que significa que puede implementarlo sabiendo que se mantendrá a través de parches, correcciones y mejoras de rendimiento durante muchos años. Puedes ver más sobre eso en el artículo de Donald Smith “El arte del soporte a largo plazo y lo que significa LTS para el ecosistema de Java.”
A continuación, exploro cuatro de los JEP que probablemente sean más relevantes para los programadores y arquitectos de desarrollo de aplicaciones que están considerando una migración desde Java 16 o Java 11, y también analizaré otras características evolutivas.
Función de idioma: Clases selladas (JEP 409)
Las clases selladas pueden ser la característica finalizada más esperada en JDK 17, y fueron vistas previas en JDK 16. En resumen, las clases selladas restringen qué otras clases (o interfaces) pueden extenderlas. Como JP 409 describe, una clase o interfaz sellada puede ser extendida o implementada solo por aquellas clases e interfaces autorizadas para hacerlo. Una clase se sella aplicando el sellado
modificador de su declaración. Entonces, después de cualquier extiende
y implementos
cláusulas, la permisos
La cláusula especifica las clases que pueden extender la clase sellada. Si a esas clases no se les permite expresamente hacer cambios, no pueden hacer cambios.
¿Por qué debería importarte? Según Aurelio García-Ribeyro, director de administración de productos de Java SE, "las clases selladas me permiten crear un conjunto de opciones que sé que es finito, y eso simplifica el código porque puedo tratar las clases como si fueran enumeraciones".
Tener clases selladas, dice, elimina la preocupación de que algún otro código pueda anular su código o modificar su comportamiento de maneras que no puede anticipar. “Crea una garantía de que nadie puede mejorar una biblioteca de una manera que rompa mi código en el futuro”.
Actualización de la biblioteca principal: filtros de deserialización específicos del contexto (JEP 415)
Los filtros de deserialización específicos del contexto se basan en una característica introducida en Java 9 (ver JEP 290: Filtrar datos de serialización entrantes). Ese antiguo JEP ofrecía filtros de deserialización por flujo intercambiables y un filtro estático para toda la JVM. Desafortunadamente, los filtros por transmisión no escalaron bien y es difícil actualizar los filtros después de enviar el código. Los filtros de JEP 290 tampoco pueden imponer el filtrado en las operaciones de deserialización realizadas por bibliotecas de terceros en una aplicación. El filtro de toda la JVM estaba limitado porque se especificaba solo una vez, al inicio, y en ocasiones era demasiado inclusivo o demasiado restrictivo.
La nueva funcionalidad en JEP 415 se presenta como una fábrica de filtros para toda la JVM. Los filtros son dinámicos y específicos del contexto. Para compatibilidad con versiones anteriores, si no se establece una fábrica de filtros, la fábrica integrada devuelve un filtro estático para toda la JVM, si se configuró uno.
El problema, dice García-Ribeyro, es que cada vez que un desarrollador creaba una canalización, tenía que definir cuál era el filtro, incluida una lista de permitidos y una lista de denegados. Sin embargo, según García-Ribeyro, “si estoy usando una biblioteca de terceros, ellos están usando sus propios flujos. Podía definir un filtro para toda la JVM, pero tenía que saber, con anticipación, todo lo que la biblioteca quería hacer. Esto requirió mucho trabajo”.
Por el contrario, JEP 415 proporciona una fábrica de filtros. “Con una fábrica de filtros, los filtros de deserialización ahora son inmensamente más fáciles de usar”, dice, “hasta el punto de que esta es la única característica que ya estamos reelaborando y modernizando, hasta JDK 11 y JDK 8”.
No hay un marco de tiempo establecido para que JEP 415 vuelva a la versión anterior de Java, pero García-Ribeyro insiste: "Estamos trabajando intensamente en ello".
Actualización de la biblioteca principal: nueva canalización de renderizado de macOS (JEP 382)
¿Usas una Mac? Sí, no sé qué haría sin mi MacBook Pro con i7 de cuatro núcleos. La nueva canalización de renderizado de macOS descrita por JPY 382 es bastante simple: aleja los gráficos 2D de la JVM del uso de la API Apple OpenGL en desuso a la nueva API de metal de Apple. Por supuesto, si está utilizando Java para cargas de trabajo de back-end, es probable que esto no le importe.
Apple comenzó a eliminar OpenGL en macOS Mojave 10.14, advirtiendo: “Las API en los marcos OpenGL y OpenCL están obsoletas y permanecen presentes por motivos de compatibilidad. Haz la transición a Metal si tu aplicación usa OpenGL u OpenCL”.
Este cambio se aplica a las Mac basadas en Intel y ARM. Este es un cambio oculto. Como dice la documentación de JEP 382, “Los cambios se limitan al código específico de macOS e incluso allí solo se actualiza una cantidad mínima de código compartido entre Metal y OpenGL. No introdujimos nuevas API de Java, ni cambiamos ninguna API existente”.
La documentación JEP 382 señala además: “Apple afirma que el marco Metal, su reemplazo para OpenGL, tiene un rendimiento superior. Para la API Java 2D, este suele ser el caso con algunas excepciones”.
Por ahora, la JVM de Java 17 usará de manera predeterminada OpenGL; usará Metal solo si OpenGL no está presente o si el usuario activa un interruptor de línea de comandos. García-Ribeyro pide, sin embargo, que los usuarios de Mac prueben el nuevo código. “Queremos que active esta nueva canalización de renderizado. Debería ser más rápido que, o al menos igual, el rendimiento de gráficos existente en Mac”.
Vista previa: Coincidencia de patrones para interruptor (JEP 406)
Probablemente he oído más sobre coincidencia de patrones para cambiar
(JE 406) que cualquier otra función de JDK 17, y García-Ribeyro también está entusiasmado con ella. “Esta característica hace que Java sea mejor para todos”, dice, “y en un par de lanzamientos, se convertirá en parte del estándar Java”.
Este PEC se basa en el trabajo de coincidencia de patrones para en vez de
(JEP 394), que se finalizó para JDK 16. La nueva característica ofrece dos grandes beneficios.
- Hace
cambiar
declaraciones mucho más programables y flexibles al permitir que aparezcan patrones encaso
etiquetas. Para citar la documentación de la JEP, “Solo se puedecambiar
en valores de unos pocos tipos: tipos numéricos, tipos de enumeración yCuerda
- y solo puede probar la igualdad exacta contra constantes. Podríamos querer usar patrones para probar la misma variable contra un número de posibilidades, tomando una acción específica en cada una, pero dado que elcambiar
no admite eso, terminamos con una cadena desi... más
pruebas.” - Proporciona un mecanismo más elegante (y fácil de usar para desarrolladores) para manejar condiciones nulas. De nuevo, para citar: “Tradicionalmente,
cambiar
declaraciones y expresiones lanzanExcepción de puntero nulo
si la expresión del selector se evalúa como nula, entonces la prueba de nula debe realizarse fuera del interruptor... Esto era razonable cuandocambiar
admite sólo unos pocos tipos de referencia. Sin embargo, sicambiar
permite una expresión de selector de cualquier tipo, y las etiquetas de casos pueden tener patrones de tipo, entonces la prueba nula independiente se siente como una distinción arbitraria, e invita a una repetición innecesaria y a la oportunidad de error”.
Espero que la mayoría de los desarrolladores descubran que cuando intentan la coincidencia de patrones para cambiar
, dirán: "¿Dónde has estado toda mi vida?"
Otras cosas nuevas en Java 17
Hay una verdadera cornucopia de nuevas funcionalidades en Java 17. Aquí hay algunos elementos que vale la pena investigar.
- La función externa y la API de memoria, que ayudan a invocar código y acceder a recursos "extranjeros" fuera de la JVM, ahora se están incubando. (Ver JP 412.)
- Java ahora tiene mejores generadores de números pseudoaleatorios. (Ver JPY 356.)
- Java tiene nuevas utilidades para trabajar con valores hexadecimales. (Ver JDK-8251989.)
- El valor predeterminado para los protocolos de enlace de seguridad en JDK 17 es TLS 1.3; las versiones anteriores de Java usaban TLS 1.2. (Ver JDK-8217633.)
- Hay un puerto Java para macOS en la arquitectura AArm64. (Ver JP 391.)
También hay depreciaciones y eliminaciones, incluidas las siguientes:
- El acceso externo a los componentes internos de Java se eliminó mediante encapsulación, con algunas excepciones, como
sol.misc.inseguro
. (Ver JP 403.) - Los compiladores AOT y JIT se han eliminado de HotSpot JVM. (Ver JP 410.)
- La Applet API está obsoleta para su eliminación. (Ver 398 JPY.)
- El Administrador de seguridad está en desuso para su eliminación. (Ver JP 411.)
- Los débiles algoritmos de seguridad 3DES y RC4 en Kerberos están obsoletos. (Ver JDK-8139348.)
- El mecanismo de fábrica de implementación de socket está en desuso. (Ver JDK-8235139.)
Finalmente, hay una nueva forma de descargar la revisión actual de Java 17 a través de un enlace estático. En el pasado, cada versión incremental de lanzamiento de punto de un JDK tenía su propia URL, lo que dificultaba incluir mediante programación el último lanzamiento de punto en un script de compilación.
“Ahora le proporcionaremos una URL permanente, para que pueda escribir un script que diga: 'Obtenga la última versión de JDK 17'”, explica García-Ribeyro. “Incluso tendremos un archivo Docker de muestra que garantizará que cada vez que construyas, obtenga la última versión de JDK 17 para ti”.
Conclusión
No se puede juzgar un libro por su portada, y no se puede juzgar una versión de Java contando sus JEP. Los cambios en Java 17 son significativos en comparación con Java 16 y, como versión LTS, la plataforma Java 17 muestra una evolución significativa con respecto a Java 11 o Java 8. Con funciones de lenguaje adicionales, mejoras en el tiempo de ejecución, vistas previas e incubadoras, y literalmente miles de arreglos más pequeños. , Java 17 está listo para ser el nuevo estándar de la plataforma Java.
Excavar más hondo
- El arte del soporte a largo plazo y lo que significa LTS para el ecosistema de Java
- Las gemas ocultas en Java 16 y Java 17
- ¿Qué están construyendo y por qué? 6 preguntas para los arquitectos Java
- Dentro del lenguaje: Tipos sellados
- Las mejores opciones y conmutadores HotSpot JVM para Java 11 a Java 17
- Un vistazo a Java 17: Encapsulando los componentes internos del tiempo de ejecución de Java
Fuente: https://blogs.oracle.com/post/java-jdk-17-generally-disponible-v2
Deja una respuesta