Versiunea Java SE 15

După șase luni de dezvoltare, Oracle a lansat platformă JavaSE 15 (Java Platform, Standard Edition 15), proiectul open-source OpenJDK este folosit ca implementare de referință. Java SE 15 menține compatibilitatea cu versiunile anterioare ale platformei Java; toate proiectele Java scrise anterior vor funcționa fără modificări atunci când sunt lansate sub noua versiune. Build-uri Java SE 15 gata de instalat (JDK, JRE și Server JRE) pregătit pentru Linux (x86_64), Windows și macOS. Implementarea de referință dezvoltată de proiectul OpenJDK Java 15 este complet open source sub licența GPLv2, cu excepții GNU ClassPath care permit conectarea dinamică cu produse comerciale.

Java SE 15 este clasificat ca o versiune de asistență generală ș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 11, care va continua să primească actualizări până în 2026. Ramura LTS anterioară a Java 8 va fi acceptată până în decembrie 2020. Următoarea lansare LTS este programată pentru septembrie 2021. 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.

De inovații Java 15 Se poate marca:

  • Incorporat suport pentru algoritmul de creare a semnăturii digitale EdDSA (Edwards-Curve Digital Signature Algorithm) RFC 8032). Implementarea EdDSA propusă nu depinde de platformele hardware, este protejată de atacurile pe canale laterale (se asigură timpul constant al tuturor calculelor) și este mai rapidă ca performanță decât implementarea ECDSA existentă scrisă în limbaj C, cu același nivel de protecție. De exemplu, EdDSA care utilizează o curbă eliptică cu o cheie de 126 de biți prezintă performanțe similare cu ECDSA cu o curbă eliptică secp256r1 și o cheie de 128 de biți.
  • Adăugat suport experimental pentru clase și interfețe sigilate, care nu pot fi utilizate de alte clase și interfețe pentru a moșteni, extinde sau suprascrie implementarea. Clasele sigilate oferă, de asemenea, o modalitate mai declarativă de a restricționa utilizarea unei superclase decât modificatorii de acces, bazată pe listarea explicită a subclaselor permise pentru extensie.

    pachet com.example.geometry;

    clasa publică sigilată Shape
    permite com.example.polar.Circle,
    com.example.quad.Dreptunghi,
    com.example.quad.simple.Pătrat {…}

  • Adăugat suport pentru clase ascunse care nu pot fi utilizate direct de bytecode-ul altor clase. Scopul cheie al claselor ascunse este de a fi utilizate în cadre care generează dinamic clase în timpul execuției și le folosesc indirect, prin reflecție. Astfel de clase au de obicei un ciclu de viață limitat, așa că menținerea lor pentru accesul din clasele generate static nu este justificată și va duce doar la un consum crescut de memorie. Clasele ascunse elimină, de asemenea, necesitatea API-ului non-standard sun.misc.Unsafe::defineAnonymousClass, care este programat pentru eliminare în viitor.
  • Colectorul de gunoi ZGC (Z Garbage Collector) a fost stabilizat și este recunoscut ca fiind gata de utilizare pe scară largă. ZGC funcționează în modul pasiv, minimizează cât mai mult posibil latența din cauza colectării gunoiului (timpul de blocare când se utilizează ZGC nu depășește 10 ms.) și poate funcționa atât cu heap-uri mici, cât și uriașe, variind ca dimensiune de la câteva sute de megabytes la mulți terabytes.
  • Stabilizat și găsit gata pentru utilizare generală
    colector de gunoi Shenandoah, lucrând cu pauze minime (Low-Pause-Time Garbage Collector). Shenandoah a fost dezvoltat de Red Hat și se remarcă prin utilizarea unui algoritm care reduce timpul de blocare în timpul colectării gunoiului prin rularea curățării în paralel cu execuția aplicațiilor Java. Mărimea întârzierilor introduse de colectorul de gunoi este previzibilă și nu depinde de dimensiunea mormanului, adică. pentru grămezi de 200 MB și 200 GB întârzierile vor fi identice (nu iesi afara peste 50 ms și de obicei în 10 ms);

  • Sprijinul a fost stabilizat și introdus în limbă blocuri de text - o nouă formă de șir de caractere literale care vă permite să includeți date text cu mai multe linii în codul sursă fără a utiliza evadarea caracterelor și păstrând formatarea textului original în bloc. Blocul este încadrat de trei ghilimele duble.

    De exemplu, în loc de cod

    String html = " » +
    "\n\t" + " » +
    "\n\t\t" + " „Java 1 este aici!” » +
    "\n\t" + " » +
    "\n" + " ";

    poti specifica:

    String html = """


    »Java 1\
    este aici!

    """;

  • Reproiectat API-ul DatagramSocket moștenit. Vechile implementări ale java.net.DatagramSocket și java.net.MulticastSocket au fost înlocuite cu o implementare modernă care este mai ușor de depanat și întreținut și este, de asemenea, compatibilă cu fluxurile virtuale dezvoltate în cadrul proiectului Război de ţesut. În caz de posibilă incompatibilitate cu codul existent, vechea implementare nu a fost eliminată și poate fi activată folosind opțiunea jdk.net.usePlainDatagramSocketImpl.
  • A doua implementare experimentală propusă potrivire de model în operatorul „instanceof”, care vă permite să definiți imediat o variabilă locală pentru a accesa valoarea bifată. De exemplu, puteți scrie imediat „if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}” fără a defini în mod explicit „String s = (String) obj”.

    A fost:

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

    Acum puteți face fără definiția „Group group = (Group) obj”:

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

  • Sugerat a doua implementare experimentală a cuvântului cheie "record", care oferă o formă compactă pentru definirea claselor, permițându-vă să evitați definirea explicită a diferitelor metode de nivel scăzut, cum ar fi equals(), hashCode() și toString() în cazurile în care datele sunt stocate numai în câmpuri al căror comportament nu se modifică. Când o clasă utilizează implementări standard ale metodelor equals(), hashCode() și toString(), se poate face fără definiția lor explicită:

    înregistrare publică BankTransaction (data LocalDate,
    suma dubla
    Descriere șir) {}

    Această declarație va adăuga automat implementări ale metodelor equals(), hashCode() și toString() în plus față de metodele constructor și getter.

  • Propus o a doua previzualizare a API-ului Foreign-Memory Access, permițând aplicațiilor Java să acceseze în mod sigur și eficient regiunile de memorie din afara heap-ului Java prin manipularea noilor abstracții MemorySegment, MemoryAddress și MemoryLayout.
  • Dezactivat și a depreciat tehnica de optimizare Biased Locking utilizată în JVM HotSpot pentru a reduce supraîncărcarea de blocare. Această tehnică și-a pierdut relevanța pe sistemele cu instrucțiuni atomice furnizate de procesoarele moderne și este prea laborioasă pentru a fi întreținută din cauza complexității sale.
  • Anunțat mecanism învechit Activare RMI, care va fi eliminat într-o versiune viitoare. Se remarcă faptul că Activarea RMI este depășită, retrogradată la o opțiune în Java 8 și aproape niciodată nu este folosită în practica modernă.
  • Șters motor JavaScript Nashorn, care a fost depreciat în Java SE 11.
  • Șters porturi pentru SO Solaris și procesoare SPARC (Solaris/SPARC, Solaris/x64 și Linux/SPARC). Eliminarea acestor porturi va permite comunității să accelereze dezvoltarea de noi caracteristici OpenJDK fără a pierde timpul cu menținerea caracteristicilor specifice Solaris și SPARC.

Sursa: opennet.ru

Adauga un comentariu