Llançament de la plataforma Java SE 22 i la implementació de referència oberta OpenJDK 22

Després de sis mesos de desenvolupament, Oracle ha llançat la plataforma Java SE 22 (Java Platform, Standard Edition 22), 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 22 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 22 (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 22 é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 22 es classifica com una versió de suport habitual i continuarà rebent actualitzacions fins a la propera versió. La branca de suport a llarg termini (LTS) hauria de ser Java SE 21 o Java SE 17, que rebrà actualitzacions fins al 2031 i el 2029, respectivament (disponible generalment fins al 2028 i 2026). El suport públic per a la branca LTS de Java SE 11 va acabar el setembre passat, però el suport ampliat continuarà fins al 2032. El suport estès per a la branca LTS de Java SE 8 continuarà fins al 2030.

Us 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 22 inclouen:

  • El col·lector d'escombraries G1 inclou suport per a la fixació de regions, que us permet arreglar temporalment la ubicació dels objectes Java a la memòria per evitar que siguin moguts pel col·lector d'escombraries i per permetre que les referències a aquests objectes es passin de manera segura entre Java i el codi natiu. La fixació us permet reduir la latència i evitar la desactivació de la recollida d'escombraries quan s'executen regions crítiques de JNI (Java Native Interface) amb codi natiu (mentre executa aquestes seccions, la JVM no hauria de moure objectes crítics associats amb elles per evitar condicions de carrera). La fixació elimina els objectes crítics de la vista del col·lector d'escombraries, que pot continuar netejant les zones sense fixar.
  • S'ha afegit una característica preliminar per permetre especificar expressions als constructors abans de cridar a super(...), que s'utilitza per cridar explícitament un constructor de classe pare des d'un constructor de classe heretat si aquestes expressions no fan referència a una instància creada pel constructor. class Outer { void hola () { System.out.println ("Hola"); } class Inner { Inner () { hola (); super(); } } }
  • L'API FFM (Foreign Function & Memory) s'ha estabilitzat, permetent la interacció de programes Java amb codi i dades externs cridant a funcions des de biblioteques externes i accedint a memòria fora de la JVM, sense recórrer a l'ús de JNI (Java Native Interface).
  • S'ha habilitat el suport per a variables sense nom i la concordança de patrons; en lloc de variables i patrons no utilitzats però necessaris quan truqueu, ara podeu especificar el caràcter "_". // era String pageName = switch (page) { case GitHubIssuePage (var url, var content, var links, int issueNumber) -> "ISSUE #" + issueNumber; ...}; // ara podeu String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • Es proposa una implementació preliminar de l'API Class-File per analitzar, generar i convertir fitxers de classe Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce: classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). startsWith("depuració"))) { classBuilder.with(ce); } } });
  • La utilitat Java ofereix la possibilitat d'executar programes Java, subministrats en forma de diversos fitxers de codi o biblioteques de classes precompilades, sense compilar aquests fitxers per separat i sense configurar el sistema de compilació. La nova característica facilita l'execució de programes en què el codi de diferents classes està separat en fitxers separats. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Hola!"); } }

    Per exemple, per executar un programa que consta de dos fitxers "Prog.java" i "Helper.java" ara n'hi ha prou amb executar "java Prog.java", que compilarà la classe Prog, definirà una referència a la classe Helper, trobar i compilar el fitxer Helper java i cridar el mètode principal.

  • S'ha afegit una segona implementació preliminar de les plantilles de cadena, implementada a més de literals de cadena i blocs de text. Les plantilles de cadena us permeten combinar text amb expressions i variables calculades sense utilitzar l'operador +. La substitució d'expressions es realitza mitjançant substitucions \{..}, i es poden connectar controladors especials per comprovar la correcció dels valors substituïts. Per exemple, el motor SQL comprova els valors que s'estan substituint al codi SQL i retorna un objecte java.sql.Statement com a sortida, mentre que el processador JSON supervisa la correcció de les substitucions JSON i retorna un JsonNode. Consulta de cadena = "SELECT * FROM Persona p ON p." + propietat + " = '" + valor + "'"; // era Consulta de declaració = SQL."""SELECT * FROM Persona p WHERE p.\{propietat} = '\{valor}'"""; // es va convertir
  • S'ha afegit una setena vista prèvia de l'API Vector, proporcionant funcions per a càlculs vectorials que es realitzen mitjançant instruccions vectorials en 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 implementació preliminar de l'API de Stream estesa que admet la definició de les vostres pròpies operacions intermèdies, que pot ser útil en els casos en què les operacions intermèdies integrades existents no són suficients per a la transformació de dades desitjada. Els controladors natius es connecten mitjançant la nova operació intermèdia Stream::gather(Gatherer), que processa els elements del flux aplicant-hi un controlador especificat per l'usuari. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • S'ha proposat per provar una segona versió de l'API experimental per a la simultaneïtat estructurada, que simplifica el desenvolupament d'aplicacions multifils processant múltiples tasques executades en diferents fils com un únic bloc.
  • S'ha afegit una segona implementació preliminar de classes declarades implícitament i instàncies sense nom del mètode "principal", que pot prescindir de declaracions públiques/estàtiques, passant una matriu d'arguments i altres entitats associades amb una declaració de classe. // era classe pública HelloWorld { public static void main(String[] args) { System.out.println("Hola món!"); } } // ara podeu void main() { System.out.println("Hola, món!"); }
  • S'ha afegit una segona implementació de vista prèvia dels valors d'abast, que permet compartir dades immutables entre fils i intercanviar dades de manera eficient entre fils secundaris (els valors s'hereten). Els valors d'abast s'estan desenvolupant per substituir el mecanisme de variables locals de fils i són més eficients quan s'utilitzen un nombre molt gran de fils virtuals (milers o milions de fils). La principal diferència entre els valors d'abast i les variables locals del fil és que les primeres s'escriuen una vegada, no es poden canviar en el futur i només romanen disponibles durant l'execució del fil.
  • El col·lector d'escombraries paral·lel ha millorat el rendiment quan es treballa amb grans matrius d'objectes. L'optimització va permetre en algunes proves amb grans matrius d'objectes reduir el retard abans de començar a buscar un objecte en un 20%.

A més, es pot destacar la publicació d'una actualització de la plataforma per a la creació d'aplicacions amb una interfície gràfica JavaFX 22.

Font: opennet.ru

Afegeix comentari