Versió de Java SE 17

Després de sis mesos de desenvolupament, Oracle ha llançat la plataforma Java SE 17 (Java Platform, Standard Edition 17), que utilitza el projecte de codi obert OpenJDK com a implementació de referència. Amb l'excepció de l'eliminació d'algunes característiques obsoletes, Java SE 17 manté la compatibilitat amb versions anteriors de la plataforma Java; la majoria dels projectes Java escrits anteriorment encara funcionaran sense modificacions quan s'executen amb la nova versió. Les compilacions instal·lables de Java SE 17 (JDK, JRE i Server JRE) estan preparades per a Linux (x86_64, AArch64), Windows (x86_64) i macOS (x86_64, AArch64). Desenvolupat pel projecte OpenJDK, la implementació de referència de Java 17 és de codi obert totalment sota la llicència GPLv2 amb excepcions GNU ClassPath per permetre l'enllaç dinàmic a productes comercials.

Java SE 17 està classificat com a versió de suport a llarg termini (LTS), que continuarà rebent actualitzacions fins al 2029. Les actualitzacions de la versió anterior de Java 16 ja s'han interromput. La branca LTS anterior de Java 11 serà compatible fins al 2026. El proper llançament de LTS està programat per al setembre de 2024. Recordem que a partir del llançament de Java 10, el projecte va passar a un nou procés de desenvolupament, la qual cosa implicava un cicle més curt per a la formació de nous llançaments. Ara es desenvolupa una nova funcionalitat en una branca mestra que s'actualitza constantment, que inclou canvis ja fets i des de la qual es ramifiquen cada sis mesos per estabilitzar les noves versions.

Les noves característiques de Java 17 inclouen:

  • Es proposa una implementació experimental de la concordança de patrons en expressions "switch", que permet utilitzar valors no exactes en etiquetes de "cas", sinó plantilles flexibles que cobreixen una sèrie de valors alhora, per als quals abans era necessari utilitzar feixucs. cadenes d'expressions “si... altra cosa”. A més, "switch" té la capacitat de gestionar valors NULL. Objecte o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Doble d -> String.format("doble %f", d); case String s -> String.format("String %s", s); per defecte -> o.toString(); };
  • Suport estabilitzat per a classes i interfícies segellades, que no poden ser utilitzades per altres classes i interfícies per heretar, ampliar o anul·lar la implementació. Les classes segellades també proporcionen una manera més declarativa de restringir l'ús d'una superclasse que els modificadors d'accés, basant-se en una llista explícita de les subclasses permeses per a l'extensió. paquet com.example.geometry; classe pública segellada Permisos de forma com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Quadrat {…}
  • Es proposa una segona vista prèvia de l'API Vector, que proporciona funcions per a càlculs vectorials que s'executen mitjançant instruccions vectorials en els processadors x86_64 i AArch64 i permeten aplicar les operacions simultàniament a diversos valors (SIMD). A diferència de les capacitats que ofereix el compilador HotSpot JIT per a la vectorització automàtica d'operacions escalars, la nova API permet controlar explícitament la vectorització per al processament de dades paral·lel.
  • S'ha afegit una vista prèvia de l'API Foreign Function & Memory, que permet a les aplicacions interactuar amb codi i dades fora del temps d'execució de Java. La nova API us permet trucar de manera eficient a funcions que no són JVM i accedir a la memòria no gestionada per JVM. Per exemple, podeu trucar a funcions des de biblioteques externes compartides i accedir a les dades del procés sense utilitzar JNI.
  • El motor de renderització de macOS que impulsa l'API Java 2D, que al seu torn impulsa l'API Swing, s'ha adaptat per utilitzar l'API de gràfics de metall. La plataforma macOS continua utilitzant OpenGL de manera predeterminada, i per habilitar el suport de Metal cal establir "-Dsun.java2d.metal=true" i, almenys, executar macOS 10.14.x.
  • S'ha afegit un port per a la plataforma macOS/AArch64 (ordinadors Apple basats en els nous xips Apple M1). Una característica especial del port és el suport per al mecanisme de protecció de memòria W^X (Write XOR Execute), en el qual no es pot accedir simultàniament a pàgines de memòria per escriure i executar. (El codi només es pot executar després que l'escriptura estigui inhabilitada, i l'escriptura en una pàgina de memòria només és possible després que l'execució estigui desactivada).
  • S'ha tornat a utilitzar només semàntica strictfp per a expressions de coma flotant. El suport per a la semàntica "per defecte", disponible des del llançament de Java 1.2, s'ha interromput, incloses les simplificacions per treballar en sistemes amb coprocessadors matemàtics x87 molt antics (després de l'arribada de les instruccions SSE2, la necessitat de semàntica addicional va desaparèixer).
  • S'han implementat nous tipus d'interfícies per als generadors de nombres pseudoaleatoris i s'han implementat algorismes addicionals per a una millor generació de nombres aleatoris. Les aplicacions tenen l'oportunitat de triar un algorisme per generar números pseudoaleatoris. Suport millorat per generar fluxos d'objectes aleatoris.
  • S'ha aplicat l'encapsulació estricta de tots els elements interns de JDK, a excepció de les API crítiques com ara sun.misc.Unsafe. L'encapsulació estricta bloqueja els intents del codi per accedir a classes, mètodes i camps interns. Anteriorment, el mode d'encapsulació estricte es podia desactivar mitjançant l'opció "--illegal-access=permit", però ara ha quedat obsolet. Les aplicacions que requereixen accés a classes, mètodes i camps interns haurien de definir-los explícitament mitjançant l'opció --add-opens o l'atribut Add-Opens al fitxer de manifest.
  • Les aplicacions tenen la capacitat de definir filtres de deserialització de dades, que poden ser sensibles al context i seleccionar dinàmicament en funció d'operacions de deserialització específiques. Els filtres especificats són aplicables a tota la màquina virtual (a tota la JVM), és a dir. cobreix no només l'aplicació en si, sinó també les biblioteques de tercers que s'utilitzen a l'aplicació.
  • Swing ha afegit el mètode javax.swing.filechooser.FileSystemView.getSystemIcon per carregar icones grans per millorar la interfície d'usuari en pantalles d'alt DPI.
  • L'API java.net.DatagramSocket proporciona suport per connectar-se a grups multicast sense necessitat d'una API java.net.MulticastSocket independent.
  • S'ha millorat la utilitat IGV (Ideal Graph Visualizer), proporcionant una visualització interactiva de la representació de codi intermedi al compilador HotSpot VM C2 JIT.
  • A JavaDoc, per analogia amb el compilador javac, quan es produeix un error, ara s'indica el número de la línia problemàtica al fitxer font i la ubicació de l'error.
  • S'ha afegit la propietat native.encoding, que reflecteix el nom de la codificació de caràcters del sistema (UTF-8, koi8-r, cp1251, etc.).
  • S'ha afegit la interfície java.time.InstantSource, que permet la manipulació del temps sense fer referència a una zona horària.
  • S'ha afegit l'API java.util.HexFormat per convertir a representació hexadecimal i viceversa.
  • S'ha afegit un mode forat negre al compilador, que desactiva les operacions d'eliminació de codi mort, que es pot utilitzar quan es realitzen proves de rendiment.
  • S'ha afegit l'opció "-Xlog:async" a Runtime per gravar registres en mode asíncron.
  • Quan s'estableixen connexions segures, TLS 1.3 està habilitat per defecte (anteriorment s'utilitzava TLS 1.2).
  • L'API Applet (java.applet.Applet*, javax.swing.JApplet) que es va declarar obsoleta anteriorment, que s'utilitzava per executar aplicacions Java al navegador, s'ha mogut a la categoria de programada per eliminar-la (es va perdre rellevància després del final del suport). per al connector Java per a navegadors).
  • Security Manager, que fa temps que ha perdut la seva rellevància i no ha estat reclamat després de la finalització del suport per al connector del navegador, s'ha mogut a la categoria dels que s'han programat per eliminar.
  • S'ha eliminat el mecanisme d'activació RMI, que està obsolet, relegat a la categoria d'opció a Java 8 i gairebé mai s'utilitza a la pràctica moderna.
  • Un compilador experimental que admet JIT (just a temps) per a la compilació dinàmica de codi Java per a HotSpot JVM, així com el mode de compilació anticipada (AOT, ahead-of-time) de classes en codi màquina abans d'iniciar la màquina virtual , s'ha eliminat de l'SDK. El compilador va ser escrit en Java i es va basar en el treball del projecte Graal. Cal assenyalar que el manteniment del compilador requereix molta mà d'obra, cosa que no es justifica quan no hi ha demanda per part dels desenvolupadors.

Font: opennet.ru

Afegeix comentari