După șase luni de dezvoltare, compania Oracle a lansat platforma Java SE 16 (Java Platform, Standard Edition 16), a cărei implementare de referință utilizează proiectul deschis OpenJDK. În Java SE 16, compatibilitatea înapoi cu versiunile anterioare ale platformei Java este păstrată, toate proiectele Java scrise anterior vor funcționa fără modificări pe noua versiune. Pachetele gata pentru instalare Java SE 16 (JDK, JRE și Server JRE) sunt pregătite pentru Linux (x86_64, AArch64), Windows și macOS. Implementarea de referință a Java 16, dezvoltată în cadrul proiectului OpenJDK, este complet deschisă sub licența GPLv2 cu excepțiile GNU ClassPath, care permit legarea dinamică cu produsele comerciale.
Java SE 16 este încadrat în categoria versiunilor cu ciclu obișnuit de suport, actualizările pentru care vor fi lansate până la următoarea versiune. Ca ramură cu termen lung de suport (LTS), se recomandă utilizarea Java SE 11, actualizările pentru care vor fi lansate până în 2026. Următoarea versiune LTS este planificată pentru septembrie 2021. Amintim că, începând cu lansarea Java 10, proiectul a trecut la un nou proces de dezvoltare, care implică un ciclu mai scurt de formare a noilor versiuni. Funcționalitatea nouă este acum dezvoltată într-o ramură master constant actualizată, în care se includ modificările deja finalizate, iar de la care se desprind ramuri pentru stabilizarea noilor versiuni la fiecare șase luni.
În pregătirea noii versiuni, dezvoltarea a fost transferată de la sistemul de gestionare a versiunilor Mercurial la Git și platforma de colaborare GitHub. Se așteaptă ca migrarea să îmbunătățească performanța operațiunilor cu repository-ul, să crească eficiența stocării, să asigure accesul la modificări pe întreaga istorie a proiectului, să îmbunătățească suportul pentru revizuirea codului și să activeze API-ul pentru automatizarea fluxurilor de lucru. În plus, utilizarea Git și GitHub face proiectul mai atractiv pentru începători și dezvoltatori obișnuiți cu Git.
Printre noutățile Java 16 se numără:
- A fost adăugat modul experimental jdk.incubator.vector cu o implementare a API-ului Vector, care oferă funcții pentru calcule vectoriale ce sunt realizate folosind instrucțiuni vectoriale ale procesoarelor x86_64 și AArch64, permițând aplicarea simultană a operațiunilor la mai multe valori (SIMD). Spre deosebire de funcționalitățile de avectorizare automată a operațiunilor scalare oferite de compilatorul JIT HotSpot, noul API permite gestionarea explicită a avectorizării pentru procesarea paralelă a datelor.
- În codul JDK și al VM HotSpot, scris în C++, este permis să se folosească caracteristicile introduse în specificația C++14. Anterior, era permisă utilizarea standardelor C++98/03.
- În colectorul de gunoi ZGC (Z Garbage Collector), care funcționează în mod pasiv și minimizează întârzierile cauzate de colectarea gunoaielor, a fost adăugată posibilitatea de procesare paralelă a stivelor firelor fără a suspenda execuția firelor aplicației. În ZGC au rămas acum doar acele operațiuni care necesită suspendarea activității, care au întârzieri constante, de obicei nerăspunzând mai mult de câteva sute de microsecunde.
- În clasele SocketChannel, ServerSocketChannel și java.nio.channels a fost adăugată suportul pentru socket-urile Unix (AF_UNIX).
- A fost realizat un port pentru distribuția Linux Alpine cu biblioteca standard C musl, populară în medii de containere, microservicii, cloud și sisteme încorporate. Portul propus în astfel de medii permite executarea programelor Java ca aplicații obișnuite. În plus, utilizând jlink, se pot elimina toate modulele neutilizate și se poate crea un mediu minim suficient pentru executarea aplicației, permițând crearea de imagini compacte specifice aplicațiilor.
- A fost implementat mecanismul Elastic Metaspace, care optimizează operațiile de alocare și returnare a memoriei ocupate de metadatele claselor (metaspace) în JVM HotSpot. Utilizarea Elastic Metaspace reduce fragmentarea memoriei, scade costurile în încărcătorul de clase și, de asemenea, are un impact benefic asupra performanței aplicațiilor server care rulează pe termen lung, datorită returnării mai rapide a memoriei ocupate de metadatele claselor neutilizate către sistemul de operare. Pentru a alege modul de eliberare a memoriei după descărcarea claselor, este propusă opțiunea „-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)”.
- A fost adăugat portul JDK pentru sistemele Windows care rulează pe hardware cu procesoare bazate pe arhitectura AArch64.
- A fost propusă a treia variantă preliminară a API-ului Foreign-Memory Access, care permite aplicațiilor Java să acceseze în mod sigur și eficient zonele de memorie în afara heap-ului Java, manipulând noile abstractizări MemorySegment, MemoryAddress și MemoryLayout.
- A fost implementat un API experimental Foreign Linker, care oferă acces din Java la codul nativ. Împreună cu API-ul Foreign-Memory, noul interfață simplifică semnificativ crearea de wrapper-e pentru bibliotecile partajate obișnuite.
- A fost adăugată utilitatea jpackage, care permite crearea de pachete pentru aplicațiile Java autonome (self-contained). Utilitatea se bazează pe javapackager din JavaFX și permite formarea de pachete în formate native pentru diferite platforme (msi și exe pentru Windows, pkg și dmg pentru macOS, deb și rpm pentru Linux). Pachetele includ toate dependențele necesare.
- Începând acum, toate elementele interne ale JDK sunt strict encapsulate în mod implicit, cu excepția API-urilor critice, cum ar fi sun.misc.Unsafe. Valoarea opțiunii „—illegal-access” este acum setată în mod implicit la „deny” în loc de „permit”, ceea ce va bloca încercările de acces din cod la majoritatea claselor, metodelor și câmpurilor interne. Pentru a ocoli această restricție, trebuie folosită opțiunea „—illegal-access=permit”.
- A fost stabilizată implementarea potrivirii cu modelul în operatorul „instanceof”, care permite determinarea imediată a unei variabile locale pentru a accesa valoarea verificată. De exemplu, acum se poate scrie: „if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}” fără a defini explicit „String s = (String) obj”. A fost: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Acum se poate elimina definirea „Group group = (Group) obj”: if (obj instanceof Group group) { var entries = group.getEntries(); }
- A fost stabilizată implementarea cuvântului cheie „record”, care oferă o formă compactă pentru definirea claselor, permițând evitarea definiției explicite a diferitelor metode de nivel inferior, cum ar fi equals(), hashCode() și toString(), în cazurile în care datele sunt păstrate doar în câmpuri, comportamentul acestora rămânând neschimbat. Când în clasă sunt utilizate implementările generice ale metodelor equals(), hashCode() și toString(), se poate renunța la definițiile lor explicite: public record BankTransaction(LocalDate date, double amount, String description) {}
Această declarație va duce la adăugarea automată a implementărilor metodelor equals(), hashCode() și toString() în plus față de constructor și metodele care controlează modificarea datelor (getter).
- A fost propusă a doua variantă preliminară a claselor și interfețelor sigilate („sealed”), care nu pot fi utilizate de alte clase și interfețe pentru moștenire, extindere sau suprascriere a implementării. Clasele sigilate oferă, de asemenea, o modalitate mai declarativă de a limita utilizarea superclasei decât modificatorii de acces, bazată pe enumerarea explicită a subclasele permise pentru extindere. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
Sursa: opennet.ro
