JavaRush /Java Blog /Random-TK /Java 14: täzelik näme?

Java 14: täzelik näme?

Toparda çap edildi
Dünýädäki meseleler dünýädäki meseleler we täze Java öz wagtynda. .Agny, takmynan alty aýda bir gezek. Java 14-iň goýberilen wersiýasy 17-nji martda çykdy we döredijilere gönükdirilen dilde birnäçe gyzykly täzelikleri hödürledi. Şolaryň arasynda ýazgy açarJava 14: täzelik näme?  - 1 sözüni eksperimental goldaw, " mysal " operatoryndaky nagyşlara laýyklygy goldamak , has köp ulanyjy üçin amatly NullPointerExceptions , tekst bloklarynyň “deslapky synlamasy” , täzelenen deslapky wyklýuçatel we başgalar bar. Java-daky ähli täzelikleriň giňeltmek tekliplerinden ( JEP, Java Enhancement Teklipleri ) başlaýandygyny ýatladýarys . Döredijiler üýtgeşmeleri teklip edýärler, “resmi” Java ene-atalary tarapyndan gözden geçirilýär we şol üýtgeşmeleriň käbiri kabul edilýär, şondan soň JDK-nyň bir bölegi bolýar. Indi bolsa hemme zat tertipli.

JEP 359: sazgylar

Recordazgylar diýlip hem atlandyrylýan ýazgylar, deslapky re modeimde JDK 14 üçin elýeterlidir we bu Java üçin düýbünden täze zat. Aslynda, Walhalla taslamasy wagtynda işlenip düzülen täze görnüşimiz bar . Sazgylar sanalmalara meňzeýär we koduňyzy ýönekeýleşdirmäge mümkinçilik berýär. Aslynda, döwleti bolan, ýöne özüni alyp barşy bolmadyk synplary çalyşýarlar. Plyönekeý söz bilen aýdylanda, meýdanlar bar, usullar ýok. Sapaklar wagtynda käwagt zerur däl köp gaýtalanýan kod ýazmaly bolýarys: konstruktorlar, aksesuarlar, deň (), hashCode (), toString () we ş.m. Bu gaýtalanýan koduň öňüni almak üçin Java meýilnamalary ýazgyny ulanmak. Ine, nusgawy wersiýa:
final class Triangle {
 	public final int x;
public final int y;
public final int z;

    public Triangle(int x, int y, int z) {
         this.x = x;
         this.y = y;
    this.z = z;
    }
    // equals, hashCode, toString
Java 14-e geçeliň we ýazgyny ulanalyň:
public record Triangle(int x, int y, int z){}
Bu hemmesi. Häzirki wagtda ýazgylaryň deslapky görnüşde bardygyny ýadyňyzdan çykarmaň, iş ýüzünde synap görmek üçin jdk14 göçürip almaly we buýrugy girizmeli:
javac —enable-preview —release 14 Triangle.java
Sazgylar, çäklendirmelerine garamazdan synplardyr. Beýleki synplary uzaldyp ýa-da meýdanlary yglan edip bilmeýärler (döwlet deklarasiýa komponentlerine gabat gelýän şahsy finaldan başga). Sazgylar gutarnykly we abstrakt bolup bilmez. Recordazgylar adaty sapaklardan tapawutlanýar, sebäbi olar API-ni wekilçilikden aýryp bilmeýärler. Emma erkinligiň ýitirilmegi takyklygyň ýokarlanmagy bilen öwezini dolýar. Componentsazgy komponentleri hem gutarnykly.

JEP 305: Mysal üçin nusga gabat gelişi (Öňünden syn)

Öňünden görüşde Java 14-de hödürlenen “Nusga gabat geliş” aýratynlygy , obýektiň görnüşini we operatoryň mysalynda öwrülişini birleşdirmek üçin döredildi . Başgaça aýdylanda, Java 14-den öň aşakdaky kod bolardy:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
Görşüňiz ýaly, obýektleri ulanjak bolýan synpymyza oklamaly. Indi Java 14 we birikdirilen “Pattern Matching” aýratynlygy kody aşakdakylara azaltmaga mümkinçilik berýär:
Object object = Violin;

if (object instanceof Instrument instrument){
    System.out.println(instrument.getMaster());
}

JEP 343: Gaplamak üçin gural (inkubator)

JDK 8-de JavaFX üçin döredilen javapackager guraly bardy. Şeýle-de bolsa, JDK 11 çykmagy bilen JavaFX-dan Java-dan aýrylandan soň, meşhur javapackager indi elýeterli däldi. Javapackager gaplaýyş guralydy. Java programmalaryna beýleki “adaty” programmalar ýaly gurnap boljak derejede gaplamaga mümkinçilik berdi. Mysal üçin, Windows ulanyjylary üçin exe faýllaryny dörediň we adam ýaly Java programmasyny işe giriziň - iki gezek basmak bilen. Elbetde, şeýle gural gaty ýetmezçilik edýär, şonuň üçin JEP 343 Java programmasyny ähli zerur garaşlylygy öz içine alýan platforma aýratyn bukjasyna gaplaýan täze gural, jpackage hödürledi. Belli bir platforma üçin goldanýan paket formatlary:
  • Linux: deb we rpm
  • macOS: pkg we dmg
  • Windows: MSI we EXE

JEP 345: G1 üçin NUMA-habarly ýadyň paýlanyşy

JEP 345 diňe NUMA (birmeňzeş däl ýadyň elýeterliligi) goldawyny amala aşyrmak üçin hyzmat edýär. Bular birmeňzeş ýadyň arhitekturasy, mikroprosessor toparyny köp prosessor ulgamyna ýadyň ýerli paýlanylyp bilinjek ulgamyny döretmegiň usulydyr: her prosessor ýadrosy az mukdarda ýerli ýady alýar, beýleki ýadrolar oňa girip bilýär. JEP 345 G1 zibil ýygnaýjysyny şeýle arhitekturadan peýdalanmak ukyby bilen enjamlaşdyrmagy meýilleşdirýär. Beýleki zatlar bilen birlikde, bu çemeleşme gaty güýçli maşynlarda öndürijiligi ýokarlandyrmaga kömek edýär.

JEP 349: JFR hadysasynyň akymy

Java Uçuş ýazgysy (JFR) indi OpenJDK-nyň bir bölegi we şonuň üçin erkin elýeterlidir. JDK 14, esasanam işjeň we hereketsiz programmalara yzygiderli gözegçilik etmek üçin JFR wakalaryny (JDK Uçuş ýazgysy) uçuşda yzarlamak üçin API goşýar. Edil şol wakalar, akymyň ýoklugy üçin ýazylýar, kellesi 1% -den az. Şeýlelik bilen, wakalar akym däl görnüş bilen bir wagtda görkeziler. Şeýle-de bolsa, JEP 349 degişli sarp ediji üçin sinhron jaňlara ýol bermeli däldir. Aralyk ýatda saklanýan ýazgylardan hem maglumatlara girip bolmaýar. Tehniki taýdan, jdk.jfr modulyndaky jdk.jfr.consumer bukjasy hadysalara asynkron giriş mümkinçiligi bilen giňeldiler.

JEP 352: Üýtgäp durmaýan kartalaşdyrylan baýt buferleri

Bilşiňiz ýaly, Java NIO (New IO) File API JDK 1.4-den bäri işleýär we soňra “Path” atly täze goşmaça enjam girizildi. Athol, Java NIO-da işleýän wagtymyz faýlyň ýa-da katalogyň wekili hökmünde java.io.File synpyny çalyşýan interfeýsdir. JEP 352 faýl maglumatlarynyň bir bölegini üýtgemeýän ýada (NVM) ýüklemek üçin MappedByteBuffer-i giňeldýär. Elektrik togy öçürilen hem bolsa (köplenç diňe okalýan ýat diýilýär) maglumatlar ýitirilmejek bu kompýuter ýady maglumatlary hemişelik saklamak üçin ulanylýar. Bu Java gowulandyryş teklibi, JDK API üçin täze modul we synp hödürleýär: NVM salgylanylýan kartalaşdyrylan baýt buferlerini (MappedByteBuffer) döretmek üçin täze rejeleri (READ_ONLY_SYNC, WRITE_ONLY_SYNC) hödürleýän jdk.nio.mapmode moduly.

JEP 358: Peýdaly NullPointerExceptions

NullPointerExceptions indi has programmist bolar. Kadadan çykmagyň beýany öňküsinden has manyly bolar. Sebäbi JVM programmanyň kod kodlaryny has takyk seljermek öwredildi we haýsy üýtgeýjiniň nol bahasyna eltýändigini görkezip biler. Kodymyz bar diýeliň:
a.getMessage().getUserInfo().getName()
Iň soňky Java-laryň haýsydyr birinde adaty ýalňyşlyk gündeligini alarys, bu bolsa kimiň takyk däldigi baradaky soraga jogap bermeýär:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
Ine, deslapky syn aýratynlygyny synap görmek kararyna gelseňiz, Java 14 size näme berer:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "UserInfo().getName()" because the return value of "Message().getUserInfo()" is null
	at Main.main(Main.java:12)
Bu zynjyr has düşnükli we ýalňyşlygy has çalt çözmäge mümkinçilik berýär.

JEP 361: Geçiş aňlatmalary (standart)

Täzelenen “Switch” operatory öňki Java 12 we 13-de bardy, ýöne diňe deslapky syn aýratynlygy hökmünde, ýagny deslapky görnüşde işledilmedi. Indi JDK 14-de hemme zat gutulardan çykýar. Java 14, L -> ... ýazgylary bilen wyklýuçatel blokynyň täze ýönekeýleşdirilen görnüşini hödürleýär. Täze görnüş käbir ýagdaýlarda kody ýönekeýleşdirýär. Ine birnäçe mysal. Hepdäniň günlerini suratlandyrýan sanumyz bar diýeliň. Klassiki kod ýazyp bileris (Java-dan öňki 14):
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
Ine, Java 14 ulanyp boljak bir wariant:
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
Şeýle hem köp setirli bloklary ýazyp, täze hasyl açar söz bilen bahany yzyna gaýtaryp bilersiňiz:
int result = switch (s) {
    case "Working from Home" -> 1;
    case "Working from Office" -> 2;
    default    -> {
        System.out.println("Neither Home nor Office… Cafe? Car? Park?...");
        yield 0;
    }
};
Täze wyklýuçatel ulanylanda ýatda saklamaly ýene birnäçe möhüm zat bar . Hususan-da, wariantlaryň doly bolmalydygyny ýadyňyzdan çykarmaly dälsiňiz. Possibleagny, mümkin bolan ähli bahalar üçin degişli wyklýuçatel belligi bolmaly. Hasyl indi açar söz bolansoň , Java 14-de hasyl diýilýän synp mümkin. Umuman, täzelenen wyklýuçatelleri nähili ulanmalydygyny öwrenmek isleseňiz, JEP 361- e gidiň we öwreniň. Ol ýerde gaty gyzykly maglumatlar bar.

JEP 362: Solaris we SPARC portlaryny köneliň

Okyjylarymyzyň köpüsiniň “Solaris” operasiýa ulgamy barada ýadyna düşenok . Java-yň ene-atasy “Sun Microsystems” tarapyndan döredilen bu UNIX esasly operasiýa ulgamy, esasan, SPARC arhitekturasyndaky serwerler üçin ulanyldy ... Her inedördül santimetrde nätanyş sözler gaty köpmi? Uly mesele ýok: JEP 362 Solaris / SPARC, Solaris / x64 we Linux / SPARC platformalaryna goldawy gutarýar. .Agny, olaryň portlary indi köneldi we geljekde OpenJDK-dan çykarylar. Şeýle-de bolsa, Solaris / SPARC, Solaris / x64 we Linux / SPARC portlary bilen baglanyşykly Java-yň köne wersiýalary (JDK 14-den öň) üýtgemezden işlemeli. Taryh buffy bolsaňyz we uzak bolmadyk tehnologiýalar bilen gyzyklanýan bolsaňyz, Wikipediýa gidiň we SPARС arhitekturasy barada okaň .

JEP 363: Bir wagtyň özünde Mark Süpürmek (CMS) hapa ýygnaýjysyny aýyryň

CMS zibil ýygnaýjy (Bir wagtyň özünde Mark Sweep) aýyrmak üçin niýetlenendir, sebäbi iki ýyl ozal köne diýlip bellendi we gözegçiliksiz galdy. Şeýle-de bolsa, CMS GC ulanyp, Java-yň köne wersiýalaryny ulanyjylar dem alyp bilerler - bu JEP-iň maksady, gurluşykçyny JDK-nyň öňki neşirlerinden aýyrmak däl. Mundan başga-da, “ParallelScavenge” we “SerialOld” zibil ýygnamak algoritmleriniň ("-XX: + UseParallelGC -XX: -UseParallelOldGC" opsiýalary bilen işlemek) utgaşmasy ýatyryldy.

JEP 364: macOS-da ZGC we JEP 365: Windows-da ZGC

Z zibil ýygnaýjy (ZGC) atly gyzykly zibil ýygnaýjy bar . Passiw re inimde işleýär we zibil ýygnamak sebäpli gijikdirmeleri azaltmaga synanyşýar: ZGC ulanylanda durmagyň wagty 10 ms-den geçmeýär. Kiçijik üýşmeler we ägirtler (köp terabaýt alýanlar) bilen işläp biler. JEP 364 we JEP 365 diýen ýaly ekizler. JEP 364 Z Zibil Kollektoryny MacOS-a getirýär. JEP-iň bir bölegi, ulanylmadyk enjam ýadyny boşatmak üçin kollektoryň işleýşini hem düşündirýär, JEP 351- de görkezilişi ýaly , bu Java 13 bilen ýüze çykýar. Makosda ZGC ýerine ýetirilişi iki bölekden ybarat:
  • MacOS-da köp kartaly ýat goldawy
  • Üznüksiz ýatda saklamak üçin ZGC goldawy
JEP 365 ZGC-ni eýýäm Windows-da, şeýle hem tejribe re iniminde goldaýar. Bu aşakdaky ýaly:
  • Köp kartaly ýat goldawy
  • Sahypa faýly esasynda ätiýaçlandyrylan salgy giňişligine ýadyň kartasyny düzmek
  • Toplumyň özbaşdak böleklerini kartalaşdyrmak we çyzmak üçin goldaw
  • Toplumyň özbaşdak böleklerini ýerine ýetirmek we goýbermezlik üçin goldaw

JEP 366: ParallelScavenge + SerialOld GC kombinasiýasyny ýatyryň

Bu JEP Parallel Scavenge we Serial Old zibil ýygnamak algoritmleriniň utgaşmasyny ýatyrýar. Bu kombinasiýa -XX: + UseParallelGC -XX: -UseParallelOldGC buýruk setiriniň parametrlerini el bilen işletmeli. Authorsazyjylar bu kombinasiýanyň gaty mahsusdygyna, şeýle hem ep-esli tehniki tagallanyň zerurdygyna ynanýarlar. Şonuň üçin indi -XX: UseParallelOldGC opsiýasy ýatyryldy we ulanylsa duýduryş peýda bolar.

JEP 367: Pack200 Gurallaryny we API-ni aýyryň

Pack200, düzülen Java synp faýllaryny saklamak üçin optimallaşdyrylan arhiw formatydyr. Bu gural Java 11-den bäri köneldi diýip bellendi. Indi java.util.jar paketinden aýyrmak üçin pack200, unpack200 we Pack200 API gurallary resmi taýdan yglan edildi . Bu tehnologiýa, gaty çäkli geçirijilik giňligi (modemler, 56k diýmek we ýatda saklamak gorkunç) we gaty disklerde saklanylýan ýer ýeterlik däl işlemek üçin Java 5-de gaýtadan girizildi. Birnäçe wagt öň Java 9 täze gysyş shemalaryny hödürledi. Işläp düzüjilere jlink ulanmagy maslahat berilýär .

JEP 368: Tekst bloklary (Ikinji syn)

Tekst bloklary ilkinji gezek Java 13-de peýda boldy. Olar köp gaçmak yzygiderliliginiň zerurlygynyň öňüni alýan, setiri awtomatiki formatlaşdyrýan we zerur bolsa döredijä setiri formatlamaga mümkinçilik berýän köp setirli söz düzümleridir. Bu peýdaly aýratynlyk indi Java 14-de elýeterlidir (2-nji syn). Tekst bloklarynyň esasy maksady, bulaşyk köp setirli sözleriň ulanylyşyny gowulandyrmak. Bu SQL talaplaryny, HTML we XML kody we JSON-y okamagy we ýazmagy ep-esli aňsatlaşdyrýar. Tekst bloklary bolmadyk HTML mysal:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
Tekst bloklary bilen nädip görkezmeli:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
Açylyş delimiteri üç goşa dyrnagyň ("" ") yzygiderliligidir, ondan soň nol ýa-da has köp boşluk, soňra bolsa çyzyk bölüji. Mazmuny açylyş delimiteriniň setir delimiterinden soň birinji harpdan başlaýar. Closapylýan delimiter Nyşanlaryň gaçmazdan görkezilmegi we tekst blokyny göni manyda tapawutlandyrmak üçin üç sany goşa sitata " saýlandy. 2019-njy ýylyň başynda, JEP 355 tekst bloklaryny JEP 326 (Çig setir sözleriniň) dowamy hökmünde teklip etdi, emma olar yzyna alyndy. Şol ýylyň ahyrynda JDK 13 tekst blokynyň deslapky synyny hödürledi, indi Java 14 iki sany täze gaçma yzygiderliligini goşdy. Bu, çyzykly terminator, belgilenen \, ikinjisi bolsa ýeke-täk giňişlik, belgilenen / s. Tekst bloklary bolmazdan täze setirleri ulanmagyň mysaly:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
Indi gaçmagyň yzygiderliligi bilen \ <line-terminator>:
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
Gaçmak yzygiderliligi, düzüjiniň deslapky äsgermezlik edýän giňişligini yzarlamak üçin ulanylýar. Ondan öňki ähli giňişligi gorap saklaýar. Mysal:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1we text2birmeňzeşdir.

JEP 370: Daşary ýurt ýadyna girmek API (inkubator)

Köp meşhur Java kitaphanalary we programmalary daşarky ýada girip bilýärler. Mysal üçin, Ignite, MapDB, Memcached we Netty ByteBuf API. Şeýle etmek bilen, zibil ýygnamak bilen baglanyşykly çykdajylardan we öňünden aýdyp bolmajak zatlardan gaça durup bilerler (esasanam uly keşlere hyzmat edende), ýadyňy birnäçe prosesde paýlaşyp bilerler we faýllary ýatda saklamak (mysal üçin, mmap ulanmak) bilen ýadyň mazmunyny tertipleşdirip we deserializasiýa edip bilerler. Şeýle-de bolsa, Java API-de daşarky ýada girmek üçin amatly çözgüt ýok. JDK 14 , täze MemorySegment, MemoryAddress we MemoryLayout abstraksiýalaryny ulanyp, Java programmalaryna JVM üýşmesiniň daşyndaky ýat sebitlerine ygtybarly we netijeli girmäge mümkinçilik berýän “ Foreign-Memory Access API” -iň deslapky synyny öz içine alýar .

Netijeler

Siziň pikiriňizçe näme? Java 13 bilen deňeşdirilende, täze Java 14 dürli ugurlarda has möhüm gowulaşmalary hödürleýär. Döredijiler üçin iň möhümi, täzelenen wyklýuçatel, giňeldilen kadadan çykmalar NullPointerExceptions we ýazgylar bolar. Ora-da ýok? .. Java 14-iň täze aýratynlyklaryny synap görmegi ýatdan çykarmaň, hatda täze başlanlar üçinem gaty peýdaly. Okuwyňyz bilen üstünlik arzuw ediň!
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION