Lansarea Java SE 17

După șase luni de dezvoltare, compania Oracle a lansat platforma Java SE 17 (Java Platform, Standard Edition 17), a cărei implementare de referință este un proiect deschis numit OpenJDK. Cu excepția eliminării unor funcționalități învechite, Java SE 17 păstrează compatibilitatea cu versiunile anterioare ale platformei Java — majoritatea proiectelor Java scrise anterior vor funcționa fără modificări pe noua versiune. Versiunile gata de instalare pentru Java SE 17 (JDK, JRE și Server JRE) sunt disponibile pentru Linux (x86_64, AArch64), Windows (x86_64) și macOS (x86_64, AArch64). Implementarea de referință pentru Java 17, dezvoltată în cadrul proiectului OpenJDK, este complet deschisă sub licența GPLv2, cu excepții GNU ClassPath, care permit legarea dinamică cu produse comerciale.

Java SE 17 este clasificat ca o lansare cu suport pe termen lung (LTS), actualizările pentru care vor fi lansate până în 2029. Lansarea actualizărilor pentru versiunea intermediară anterioară, Java 16, a fost oprită. Vrstele LTS anterioare, Java 11, vor fi susținute până în 2026. Următoarea lansare LTS este programată pentru septembrie 2024. 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 lansări. Funcționalitatea nouă se dezvoltă acum într-o ramură principală actualizată constant, în care se includ modificările deja gata și de la care se ramifică la fiecare șase luni ramurile pentru stabilizarea noilor lansări.

Printre noutățile Java 17 se numără:

  • O implementare experimentală a corespondenței prin șabloane în expresiile „switch” a fost propusă, permițând utilizarea unor șabloane flexibile în etichetele „case”, care acoperă o serie de valori pentru care anterior era nevoie de șiruri de expresii „if...else” complexe. În plus, în interiorul „switch” sunt disponibile funcționalități pentru gestionarea valorilor NULL. Object o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); };
  • S-a stabilizat suportul pentru clasele și interfețele închise („sealed”), care nu pot fi utilizate de alte clase și interfețe pentru moștenire, extindere sau suprascrierea implementării. Clasele închise oferă, de asemenea, o modalitate mai declarativă de a restricționa 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 {…}
  • A fost propusă o a doua implementare preliminară a API-ului Vector, care oferă funcții pentru calcule vectoriale ce sunt realizate folosind instrucțiuni vectoriale ale procesoarelor x86_64 și AArch64 și permit aplicarea simultană a operațiunilor la mai multe valori (SIMD). Spre deosebire de funcțiile de avotovectorizare a operațiunilor scalare disponibile în compilatorul JIT HotSpot, noul API oferă posibilitatea de a gestiona explicit vectorizarea pentru procesarea paralelă a datelor.
  • A fost adăugată o implementare preliminară a API-ului Foreign Function & Memory, prin care aplicațiile pot interacționa cu codul și datele aflate în afara mediului de execuție Java. Noul API permite apelarea eficientă a funcțiilor care nu sunt rulate în JVM și accesarea memoriei care nu este gestionată de JVM. De exemplu, pot fi apelate funcții din biblioteci externe partajate și accesate datele procesului fără a utiliza JNI.
  • Motorul de redare pentru macOS, care asigură funcționarea API-ului Java 2D, folosit în cadrul API-ului Swing, a fost adaptat pentru a utiliza API-ul grafic Metal. Implicit, pe platforma macOS rămâne utilizat OpenGL, iar pentru a activa suportul Metal este necesară setarea opțiunii „-Dsun.java2d.metal=true” și utilizarea unei versiuni macOS de minimum 10.14.x.
  • A fost adăugat un port pentru platforma macOS/AArch64 (calculatoarele Apple bazate pe noile cipuri Apple M1). O caracteristică a portului este suportul pentru mecanismul de protecție a memoriei W^X (Write XOR Execute), în care paginile de memorie nu pot fi accesibile simultan pentru scriere și execuție. (Codul poate fi executat numai după interzicerea scrierii, iar scrierea într-o pagină de memorie este posibilă doar după interzicerea execuției).
  • Utilizarea semanticii stricte (strictfp) a fost restabilită pentru expresiile cu virgulă mobilă. Suportul pentru semantica "default" a fost eliminat începând cu versiunea Java 1.2, care includea simplificări pentru funcționarea pe sisteme cu coprocessori matematici x87 foarte vechi (necesitatea unei semantici suplimentare a dispărut odată cu apariția instrucțiunilor SSE2).
  • Au fost implementate noi tipuri de interfețe pentru generatoarele de numere pseudo-aleatoare, precum și algoritmi suplimentari pentru o generare mai calitativă a numerelor aleatoare. Aplicațiile au fost dotate cu opțiunea de a alege algoritmul de generare a numerelor pseudo-aleatoare. Suportul pentru generarea fluxurilor de obiecte aleatoare a fost îmbunătățit.
  • A fost implementată o incapsulare strictă obligatorie a tuturor elementelor interne JDK, cu excepția API-urilor critice, cum ar fi sun.misc.Unsafe. Incapsularea strictă blochează încercările de acces din cod la clase interne, metode și câmpuri. Anterior, modul de incapsulare strictă putea fi dezactivat prin opțiunea "—illegal-access=permit", dar acum aceasta a fost declarată învechită. Aplicațiile care necesită acces la clasele interne, metode și câmpuri trebuie să le definească explicit prin opțiunea "—add-opens" sau atributul Add-Opens din fișierul de manifest.
  • Aplicațiile pot defini filtre pentru deserializarea datelor, care pot depinde de context și pot fi selectate dinamic în legătură cu anumite operațiuni de deserializare. Filtrele specificate sunt aplicabile pe întreaga mașina virtuală (JVM-wide), adică acoperă nu doar aplicația în sine, ci și bibliotecile externe folosite în aplicație.
  • În Swing a fost adăugat metoda javax.swing.filechooser.FileSystemView.getSystemIcon pentru a încărca pictograme de dimensiuni mari, permițând îmbunătățirea generării interfeței pe ecranele cu densitate mare de pixeli (HighDPI).
  • În API-ul java.net.DatagramSocket a fost implementat suportul pentru conectarea la grupuri Multicast fără a fi nevoie de utilizarea unui API separat java.net.MulticastSocket.
  • Utilitarul IGV (Ideal Graph Visualizer) a fost îmbunătățit, oferind o vizualizare interactivă a reprezentării intermediare a codului în compilatorul JIT HotSpot VM C2.
  • În JavaDoc, similar cu compilatorul javac, la generarea unei erori este acum indicat numărul liniei problematice din fișierul sursă și locul erorii.
  • A fost adăugată proprietatea native.encoding, care reflectă numele codării de caractere a sistemului (UTF-8, koi8-r, cp1251 etc.).
  • A fost adăugat interfața java.time.InstantSource, care permite manipularea timpului fără legătură cu fusul orar.
  • A fost adăugat API-ul java.util.HexFormat pentru a converti în și din reprezentarea hexadecimală.
  • În compilator a fost adăugat modul blackhole, care dezactivează operațiile de eliminare a codului neutilizat (dead-code elimination), ce poate fi folosit în testele de performanță.
  • În Runtime a fost adăugată opțiunea „-Xlog:async” pentru înregistrarea log-urilor în mod asincron.
  • La stabilirea conexiunilor securizate, implicit este utilizat TLS 1.3 (anterior se folosea TLS 1.2).
  • A fost mutat în categoria celor prevăzute pentru eliminare API-ul Applet (java.applet.Applet*, javax.swing.JApplet), care a fost folosit pentru a rula aplicații Java în browser (a devenit învechit după întreruperea suportului Java Plugin pentru browsere).
  • A fost mutat în categoria celor prevăzute pentru eliminare Security Manager, care a pierdut relevanța și nu a mai fost utilizat după întreruperea suportului pentru pluginul browserului.
  • Mecanismul RMI Activation a fost eliminat, fiind învechit, mutat în categoria opțiunilor încă din Java 8 și aproape deloc utilizat în practica modernă.
  • Compilerul experimental care suportă JIT (just-in-time) pentru compilarea dinamică a codului Java pentru HotSpot JVM, precum și modul de compilare anticipată (AOT, ahead-of-time) a claselor în cod mașină înainte de rularea mașinii virtuale a fost eliminat din SDK. Compilerul a fost scris în Java și s-a bazat pe lucrările proiectului Graal. Se observă că întreținerea compilatorului necesită un efort considerabil, care nu se justifică în condițiile lipsa de cerere din partea dezvoltatorilor.

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster