Lansarea platformei Java SE 22 și implementarea de referință deschisă OpenJDK 22

După șase luni de dezvoltare, Oracle a lansat platforma Java SE 22 (Java Platform, Standard Edition 22), care folosește proiectul open source OpenJDK ca implementare de referință. Cu excepția eliminării unor caracteristici depreciate, Java SE 22 menține compatibilitatea cu versiunile anterioare ale platformei Java – majoritatea proiectelor Java scrise anterior vor funcționa în continuare fără modificări atunci când sunt rulate sub noua versiune. Versiunile gata de instalare ale Java SE 22 (JDK, JRE și Server JRE) sunt pregătite pentru Linux (x86_64, AArch64), Windows (x86_64) și macOS (x86_64, AArch64). Dezvoltată de proiectul OpenJDK, implementarea de referință Java 22 este complet open source sub licența GPLv2 cu excepții GNU ClassPath pentru a permite conectarea dinamică la produsele comerciale.

Java SE 22 este clasificat ca o versiune de asistență obișnuită și va continua să primească actualizări până la următoarea ediție. Suportul pe termen lung (LTS) ar trebui să fie Java SE 21 sau Java SE 17, care va primi actualizări până în 2031, respectiv 2029 (disponibil în general până în 2028 și 2026). Sprijinul public pentru ramura LTS a Java SE 11 sa încheiat în septembrie anul trecut, dar suportul extins va continua până în 2032. Suportul extins pentru ramura LTS a Java SE 8 va continua până în 2030.

Să vă reamintim că începând cu lansarea Java 10, proiectul a trecut la un nou proces de dezvoltare, implicând un ciclu mai scurt pentru formarea de noi versiuni. Noua funcționalitate este acum dezvoltată într-o ramură principală actualizată constant, care include modificări gata făcute și din care ramurile sunt ramificate la fiecare șase luni pentru a stabiliza noile versiuni.

Noile funcții din Java 22 includ:

  • Colectorul de gunoi G1 include suport pentru fixarea regiunilor, care vă permite să fixați temporar locația obiectelor Java în memorie pentru a evita mutarea acestora de către colectorul de gunoi și pentru a permite trimiterea în siguranță la aceste obiecte între Java și codul nativ. Fixarea vă permite să reduceți latența și să evitați dezactivarea colectării gunoiului atunci când executați regiuni critice ale JNI (Java Native Interface) cu cod nativ (în timp ce executați aceste secțiuni, JVM-ul nu ar trebui să mute obiectele critice asociate acestora pentru a evita condițiile de cursă). Fixarea elimină obiectele critice din vederea colectorului de gunoi, care pot continua să curețe zonele nefixate.
  • A fost adăugată o caracteristică preliminară pentru a permite specificarea expresiilor în constructori înainte de a apela super(...), folosită pentru a apela explicit un constructor de clasă părinte de la un constructor de clasă moștenit dacă acele expresii nu se referă la o instanță creată de constructor. class Outer { void hello() { System.out.println("Bună ziua"); } class Inner { Inner() { salut(); super(); } } }
  • API-ul FFM (Foreign Function & Memory) a fost stabilizat, permițând interacțiunea programelor Java cu cod și date externe prin apelarea funcțiilor din biblioteci externe și accesarea memoriei din afara JVM-ului, fără a recurge la utilizarea JNI (Java Native Interface).
  • Suportul pentru variabile fără nume și potrivirea modelelor a fost activat - în loc de variabile și modele neutilizate, dar necesare, atunci când apelați, puteți specifica acum caracterul „_”. // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> „ISSUE #” + issueNumber; ... }; // acum puteți String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> „ISSUE #” + issueNumber; };
  • O implementare preliminară a API-ului Class-File este propusă pentru analizarea, generarea și convertirea fișierelor de clasă 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("debug"))) { classBuilder.with(ce); } } });
  • Utilitarul java oferă posibilitatea de a rula programe Java, furnizate sub formă de mai multe fișiere de cod sau biblioteci de clase precompilate, fără a compila separat aceste fișiere și fără a configura sistemul de construire. Noua caracteristică facilitează rularea programelor în care codul diferitelor clase este separat în fișiere separate. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Bună ziua!"); } }

    De exemplu, pentru a rula un program format din două fișiere „Prog.java” și „Helper.java” este suficient să rulați „java Prog.java”, care va compila clasa Prog, va defini o referință la clasa Helper, găsiți și compilați fișierul Helper.java și apelând metoda principală.

  • S-a adăugat o a doua implementare preliminară a șabloanelor de șir, implementată în plus față de literalele șirurile și blocurile de text. Șabloanele șiruri vă permit să combinați text cu expresii și variabile calculate fără a utiliza operatorul +. Înlocuirea expresiilor se realizează folosind substituții \{..} și pot fi conectați handlere speciali pentru a verifica corectitudinea valorilor înlocuite. De exemplu, motorul SQL verifică valorile care sunt înlocuite în codul SQL și returnează un obiect java.sql.Statement ca ieșire, în timp ce procesorul JSON monitorizează corectitudinea substituțiilor JSON și returnează un JsonNode. Interogare șir = „SELECT * FROM Persoană p WHERE p.” + proprietate + " = '" + valoare + "'"; // a fost Interogare de instrucțiune = SQL."""SELECT * FROM Person p WHERE p.\{proprietate} = '\{valoare}'"""; // a devenit
  • A fost adăugată o a șaptea previzualizare a Vector API, oferind funcții pentru calcule vectoriale care sunt efectuate folosind instrucțiuni vectoriale pe procesoarele x86_64 și AArch64 și permit operațiunilor să fie aplicate simultan la mai multe valori (SIMD). Spre deosebire de capabilitățile oferite de compilatorul HotSpot JIT pentru vectorizarea automată a operațiunilor scalare, noul API face posibilă controlul explicit al vectorizării pentru procesarea paralelă a datelor.
  • A fost adăugată o implementare preliminară a API-ului Stream extins care acceptă definirea propriilor operațiuni intermediare, ceea ce poate fi util în cazurile în care operațiunile intermediare încorporate existente nu sunt suficiente pentru transformarea dorită a datelor. Manipulatorii nativi sunt conectați folosind noua operațiune intermediară Stream::gather(Gatherer), care procesează elementele fluxului aplicând acestora un handler specificat de utilizator. 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]]
  • O a doua versiune a API-ului experimental pentru Concurență Structurată a fost propusă pentru testare, care simplifică dezvoltarea aplicațiilor cu mai multe fire prin procesarea mai multor sarcini executate în fire diferite ca un singur bloc.
  • S-a adăugat o a doua implementare preliminară a claselor declarate implicit și a instanțelor nenumite ale metodei „principale”, care se poate renunța la declarații publice/statice, transmiterea unei serii de argumente și a altor entități asociate cu o declarație de clasă. // a fost public class HelloWorld { public static void main(String[] args) { System.out.println("Bună lume!"); } } // acum puteți void main() { System.out.println("Bună ziua, lume!"); }
  • S-a adăugat o a doua implementare de previzualizare a Scoped Values, permițând partajarea datelor imuabile între fire și schimbul eficient de date între firele secundare (valorile sunt moștenite). Valorile Scoped sunt dezvoltate pentru a înlocui mecanismul variabilelor locale de fir și sunt mai eficiente atunci când se utilizează un număr foarte mare de fire virtuale (mii sau milioane de fire). Principala diferență dintre Valorile Scoped și variabilele locale ale firului este că primele sunt scrise o singură dată, nu pot fi modificate în viitor și rămân disponibile numai pe durata execuției firului.
  • Colectorul de gunoi paralel a îmbunătățit performanța atunci când lucrați cu matrice mari de obiecte. Optimizarea a făcut posibilă în unele teste cu matrice mari de obiecte reducerea întârzierii înainte de a începe căutarea unui obiect cu 20%.

În plus, puteți observa publicarea unei actualizări a platformei pentru crearea de aplicații cu o interfață grafică JavaFX 22.

Sursa: opennet.ru

Adauga un comentariu