Izdanje Java SE 22 platforme i OpenJDK 22 open reference implementacije

Nakon šest mjeseci razvoja, Oracle je objavio platformu Java SE 22 (Java Platform, Standard Edition 22), koja koristi OpenJDK open source projekat kao referentnu implementaciju. Sa izuzetkom uklanjanja nekih zastarjelih funkcija, Java SE 22 održava kompatibilnost unatrag s prethodnim izdanjima Java platforme—većina prethodno napisanih Java projekata će i dalje raditi bez modifikacija kada se pokrene pod novom verzijom. Instalacijske verzije Java SE 22 (JDK, JRE i Server JRE) pripremljene su za Linux (x86_64, AArch64), Windows (x86_64) i macOS (x86_64, AArch64). Razvijena od strane OpenJDK projekta, Java 22 referentna implementacija je potpuno otvorenog koda pod GPLv2 licencom sa GNU ClassPath izuzecima kako bi se omogućilo dinamičko povezivanje sa komercijalnim proizvodima.

Java SE 22 je klasifikovana kao redovno izdanje za podršku i nastavit će primati ažuriranja do sljedećeg izdanja. Ogranak za dugoročnu podršku (LTS) bi trebao biti Java SE 21 ili Java SE 17, koji će primati ažuriranja do 2031. odnosno 2029. (generalno dostupno do 2028. i 2026.). Javna podrška za LTS granu Java SE 11 završila je prošlog septembra, ali produžena podrška će se nastaviti do 2032. godine. Proširena podrška za LTS granu Java SE 8 nastavit će se do 2030. godine.

Podsjetimo, počevši od izdavanja Jave 10, projekat je prešao na novi razvojni proces, što podrazumijeva kraći ciklus za formiranje novih izdanja. Nova funkcionalnost je sada razvijena u jednoj stalno ažuriranoj glavnoj grani, koja uključuje gotove promjene i iz koje se grane granaju svakih šest mjeseci kako bi se stabilizirala nova izdanja.

Nove funkcije u Javi 22 uključuju:

  • G1 sakupljač smeća uključuje podršku za pričvršćivanje regiona, što vam omogućava da privremeno popravite lokaciju Java objekata u memoriji kako biste izbegli njihovo pomeranje od strane sakupljača smeća i omogućili da se reference na ove objekte bezbedno prosleđuju između Jave i izvornog koda. Kačenje vam omogućava da smanjite kašnjenje i izbegnete onemogućavanje sakupljanja smeća kada izvršavate kritične regione JNI (Java Native Interface) sa izvornim kodom (dok izvršava ove sekcije, JVM ne bi trebalo da pomera kritične objekte povezane sa njima kako bi se izbegli uslovi trke). Kačenjem uklanjaju se kritični predmeti iz vidokruga sakupljača smeća, koji može nastaviti s čišćenjem nepovezanih područja.
  • Dodata je preliminarna karakteristika koja omogućava da se izrazi specificiraju u konstruktorima prije pozivanja super(...), koji se koristi za eksplicitno pozivanje konstruktora roditeljske klase iz naslijeđenog konstruktora klase ako se ti izrazi ne odnose na instancu kreiranu od strane konstruktora. class Outer { void hello() { System.out.println("Zdravo"); } class Inner { Inner() { hello(); Super(); } } }
  • FFM (Foreign Function & Memory) API je stabiliziran, omogućavajući interakciju Java programa sa eksternim kodom i podacima pozivanjem funkcija iz vanjskih biblioteka i pristupanjem memoriji izvan JVM-a, bez pribjegavanja korištenju JNI (Java Native Interface).
  • Omogućena je podrška za neimenovane varijable i podudaranje uzoraka - umjesto neiskorištenih, ali neophodnih varijabli i obrazaca prilikom pozivanja, sada možete odrediti znak “_”. // was String pageName = switch (stranica) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ... }; // sada možete String pageName = switch (stranica) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • Predlaže se preliminarna implementacija Class-File API-ja za raščlanjivanje, generisanje i konvertovanje Java datoteka klasa. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instance of MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);
  • Java uslužni program pruža mogućnost pokretanja Java programa, koji se isporučuju u obliku nekoliko datoteka koda ili unaprijed kompajliranih biblioteka klasa, bez posebnog kompajliranja ovih datoteka i bez konfigurisanja sistema izgradnje. Nova funkcija olakšava pokretanje programa u kojima je kod različitih klasa razdvojen u zasebne datoteke. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Halo!"); } }

    Na primjer, za pokretanje programa koji se sastoji od dvije datoteke "Prog.java" i "Helper.java" sada je dovoljno pokrenuti "java Prog.java", koji će kompajlirati klasu Prog, definirati referencu na klasu Helper, pronaći i kompajlirati Helper datoteku i pozvati main metod.

  • Dodata je druga preliminarna implementacija String Templatea, implementirana pored string literala i tekstualnih blokova. Predlošci nizova vam omogućavaju da kombinujete tekst sa izračunatim izrazima i varijablama bez upotrebe + operatora. Zamjena izraza se vrši korištenjem supstitucija \{..}, a mogu se povezati posebni rukovaoci za provjeru ispravnosti zamijenjenih vrijednosti. Na primjer, SQL motor provjerava vrijednosti koje se zamjenjuju u SQL kodu i vraća objekt java.sql.Statement kao izlaz, dok JSON procesor prati ispravnost JSON zamjena i vraća JsonNode. String query = "SELECT * FROM Person p WHERE p." + svojstvo + " = '" + vrijednost + "'"; // was Statement query = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // postao
  • Dodan je sedmi pregled Vector API-ja koji pruža funkcije za vektorske proračune koje se izvode pomoću vektorskih instrukcija na x86_64 i AArch64 procesorima i omogućavaju da se operacije istovremeno primjenjuju na više vrijednosti (SIMD). Za razliku od mogućnosti koje pruža HotSpot JIT kompajler za auto-vektorizaciju skalarnih operacija, novi API omogućava eksplicitnu kontrolu vektorizacije za paralelnu obradu podataka.
  • Dodata je preliminarna implementacija proširenog Stream API-ja koji podržava definiranje vaših vlastitih međuoperacija, što može biti korisno u slučajevima kada postojeće ugrađene međuoperacije nisu dovoljne za željenu transformaciju podataka. Nativni rukovaoci su povezani pomoću nove posredne operacije Stream::gather(Gatherer), koja obrađuje elemente toka primjenom rukovatelja specificiranog od strane na njih. 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]]
  • Druga verzija eksperimentalnog API-ja za strukturiranu konkurentnost je predložena za testiranje, koja pojednostavljuje razvoj višenitnih aplikacija obradom više zadataka koji se izvršavaju u različitim nitima kao jedan blok.
  • Dodata je druga preliminarna implementacija implicitno deklariranih klasa i neimenovanih instanci "main" metode, koja može izostaviti javne/statičke deklaracije, prosljeđivanje niza argumenata i drugih entiteta povezanih s deklaracijom klase. // je bila javna klasa HelloWorld { public static void main(String[] args) { System.out.println("Zdravo svijet!"); } } // sada možete void main() { System.out.println("Halo, World!"); }
  • Dodata je druga implementacija za pretpregled Scoped Values, koja omogućava dijeljenje nepromjenjivih podataka u nitima i efikasnu razmjenu podataka između podređenih niti (vrijednosti se nasljeđuju). Vrijednosti opsega se razvijaju kako bi zamijenile mehanizam lokalnih varijabli niti i efikasnije su kada se koristi vrlo veliki broj virtualnih niti (hiljade ili milioni niti). Glavna razlika između vrijednosti opsega i lokalnih varijabli niti je u tome što se prve pišu jednom, ne mogu se mijenjati u budućnosti i ostaju dostupne samo za vrijeme izvršavanja niti.
  • Paralelni sakupljač smeća je poboljšao performanse pri radu sa velikim nizovima objekata. Optimizacija je u nekim testovima sa velikim nizovima objekata omogućila smanjenje kašnjenja prije početka traženja objekta za 20%.

Osim toga, možete primijetiti objavljivanje ažuriranja platforme za kreiranje aplikacija s grafičkim sučeljem JavaFX 22.

izvor: opennet.ru

Dodajte komentar