Lansarea Java SE 15

După șase luni de dezvoltare, compania Oracle a lansat platforma Java SE 15 (Java Platform, Standard Edition 15), ca implementare de referință fiind utilizat proiectul deschis OpenJDK. Java SE 15 păstrează compatibilitatea înapoi cu versiunile anterioare ale platformei Java, toate proiectele Java scrise anterior vor funcționa fără modificări pe noua versiune. Versiunile gata de instalare ale Java SE 15 (JDK, JRE și Server JRE) sunt pregătite pentru Linux (x86_64), Windows și macOS. Implementarea de referință dezvoltată în cadrul proiectului OpenJDK Java 15 este complet deschisă sub licența GPLv2 cu excepții GNU ClassPath, care permit legarea dinamică cu produse comerciale.

Java SE 15 este clasificat ca o versiune cu suport obișnuit, actualizările pentru care vor fi lansate până la următoarea versiune. Ca ramură cu suport pe termen lung (LTS), ar trebui utilizată Java SE 11, actualizările pentru care vor fi lansate până în 2026. Anteriora ramură LTS, Java 8, va fi suportată până în decembrie 2020. Următoarea versiune LTS este planificată pentru septembrie 2021. Să reamintim că începând cu lansarea Java 10, proiectul a adoptat un nou proces de dezvoltare, care implică un ciclu mai scurt de formare a noilor versiuni. Noile funcționalități sunt acum dezvoltate într-o ramură principală care este constant actualizată, în care sunt incluse modificări deja pregătite și din care se ramifică, la fiecare șase luni, ramuri pentru stabilizarea noilor lansări.

Din inovații Java 15 poate remarc:

  • Este inclusă suportul pentru algoritmul de generare a semnăturii digitale EdDSA (Edwards-Curve Digital Signature Algorithm RFC 8032). Implementarea propusă a EdDSA nu depinde de platformele hardware, este protejată împotriva atacurilor prin canal lateral (asigurând un timp constant pentru toate calculele) și din punct de vedere al performanței depășește implementarea existentă ECDSA, scrisă în limbajul C, având același nivel de protecție. De exemplu, EdDSA folosind o curbă eliptică cu o cheie de 126 de biți demonstrează o performanță similară cu ECDSA cu curbă eliptică secp256r1 și o cheie de 128 de biți.
  • Adăugat suport experimental pentru clase și interfețe sigilate („sealed”) care nu pot fi utilizate de alte clase și interfețe pentru moștenire, extindere sau redefinirea implementării. Clasele sigilate oferă, de asemenea, o modalitate mai declarativă de a limita utilizarea superclasei, comparativ cu modificatorii de acces, care se bazează pe enumerarea explicită a subclasele admise pentru extindere.

    package com.example.geometry;

    public sealed class Shape
    permits com.example.polar.Circle,
    com.example.quad.Rectangle,
    com.example.quad.simple.Square {…}

  • Adăugat suport pentru clase ascunse care nu pot fi utilizate direct de codul byte al altor clase. Principala utilizare a claselor ascunse este în cadrele de lucru care generează dinamic clase în timpul execuției și le utilizează indirect, prin reflecție. Aceste clase au, de obicei, un ciclu de viață limitat, astfel încât întreținerea lor pentru acces din clasele generate static nu este justificată și va duce doar la o creștere a consumului de memorie. Clasele ascunse permit, de asemenea, evitarea API-ului neoficial sun.misc.Unsafe::defineAnonymousClass, care este programat pentru eliminare în viitor.
  • Colectorul de gunoi ZGC (Z Garbage Collector) a fost stabilizat și recunoscut ca fiind pregătit pentru utilizare pe scară largă. ZGC funcționează în modul pasiv, minimizând întârzierile cauzate de colectarea gunoiului (timpul de oprire la utilizarea ZGC nu depășește 10 ms.) și poate funcționa atât cu heap-uri mici, cât și cu cele uriașe, cu dimensiuni de la câteva sute de megabiți până la multe terabiți.
  • Stabilizat și recunoscut ca fiind pregătit pentru utilizare pe scară largă
    colector de gunoi Shenandoah, funcționează cu întârzieri minime (Low-Pause-Time Garbage Collector). Shenandoah a fost dezvoltat de Red Hat și se remarcă prin utilizarea unui algoritm care reduce timpul de oprire în timpul colectării gunoiului prin efectuarea curățării în paralel cu executarea aplicațiilor Java. Dimensiunea întârzierilor introduse de colectorul de gunoi este predictibilă și nu depinde de dimensiunea heap-ului, adică pentru heap-uri de 200 MB și 200 GB întârzierile vor fi identice (nu depășesc 50 ms și, de obicei, se încadrează în 10 ms);
  • Suport pentru blocuri de text — o nouă formă de litere de tip string, care permite includerea datelor textuale multilini în codul sursă fără a necesita escaparea caracterelor și păstrând formatul original al textului în bloc. Delimitarea blocului se face cu trei ghilimele duble.

    De exemplu, în loc de codul

    String html = "" +
    "\n\t" + "" +
    "\n\t\t" + "

    \"Java 15 este aici!\"" +
    "\n\t" + "" +
    "\n" + "";

    poate fi specificat:

    String html = """
    <HTML>
    <BODY>

    "Java 15\
    este aici!"
    </BODY>
    """;

  • Reformulat API Legacy DatagramSocket. Implementările vechi java.net.DatagramSocket și java.net.MulticastSocket au fost înlocuite cu o implementare modernă, mai simplă pentru depanare și întreținere, fiind de asemenea compatibilă cu firele virtuale dezvoltate în cadrul proiectului Loom. În cazul unor posibile probleme de compatibilitate cu codul existent, vechea implementare nu a fost ștearsă și poate fi activată prin opțiunea jdk.net.usePlainDatagramSocketImpl.
  • A fost propusă o a doua implementare experimentală așocierea cu un model în operatorul „instanceof”, care permite imediat determinarea unei variabile locale pentru a accesa valoarea verificată. De exemplu, poate fi scris direct „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 renunța la definiția „Group group = (Group) obj”:

    if (obj instanceof Group group) {
    var entries = group.getEntries();
    }

  • A fost propusă a doua implementare experimentală a cuvântului cheie „record“, oferind o formă compactă pentru definirea claselor, permițând evitarea definiției explicite a diverselor metode de nivel inferior, cum ar fi equals(), hashCode() și toString(), în cazurile în care datele sunt stocate doar în câmpuri, comportamentul acestora nefiind modificat. Atunci când în clasă sunt utilizate implementări tipice 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).

  • Propus a doua variantă preliminară a API Foreign-Memory Access, permițând aplicațiilor Java să acceseze în siguranță și eficient zone de memorie în afara heap-ului Java, manipulând noile abstracții MemorySegment, MemoryAddress și MemoryLayout.
  • Suportul pentru protocoalele TLS 1.0 și TLS 1.1 a fost dezactivat. tehnica de optimizare Biased Locking, utilizată în HotSpot JVM pentru a reduce cheltuielile cauzate de blocaje, a fost declarată învechită. Această tehnică a devenit lipsită de relevanță pe sistemele cu instrucțiuni atomice furnizate de procesoarele moderne și este prea costisitoare pentru întreținere din cauza complexității sale.
  • Declarat învechit mecanism Activarea RMI, care va fi eliminată într-una din viitoarele versiuni. Se remarcă faptul că Activarea RMI a fost declarată învechită, clasificată ca opțiune încă din Java 8 și aproape nu este utilizată în practica modernă.
  • Eliminat motorul JavaScript Nashorn, care a fost declarat învechit în Java SE 11.
  • Au fost eliminate porturile pentru sistemul de operare Solaris și procesoarele SPARC (Solaris/SPARC, Solaris/x64 și Linux/SPARC). Eliminarea acestor porturi va permite comunității să accelereze dezvoltarea de noi funcționalități OpenJDK, fără a pierde timp cu menținerea caracteristicilor specifice Solaris și SPARC.

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