JavaRush /Java Blogu /Random-AZ /Java 14: yeni nə var?

Java 14: yeni nə var?

Qrupda dərc edilmişdir
Dünyanın problemləri dünyanın problemləridir və yeni Java qrafik üzrədir. Yəni düz altı ayda bir dəfə. Java 14-ün buraxılış versiyası martın 17-də buraxıldı və tərtibatçılar üçün dilə bir sıra maraqlı yeniliklər təqdim etdi. Onların arasında rekordJava 14: yeni nə var?  - 1 açar söz üçün eksperimental dəstək, " instanceof " operatorunda nümunə uyğunluğu dəstəyi , daha çox istifadəçi dostu NullPointerExceptions , mətn bloklarının genişləndirilmiş "öncədən baxılması" , yenilənmiş standart keçid və daha çox şey var. Nəzərinizə çatdıraq ki, Java-da bütün yeniliklər genişləndirmə təklifləri ilə başlayır ( JEP, Java Enhancement Proposals ). Tərtibatçılar dəyişikliklər təklif edirlər, onlar “rəsmi” Java valideynləri tərəfindən nəzərdən keçirilir və sonra bu dəyişikliklərin bəziləri qəbul edilir, bundan sonra onlar JDK-nın bir hissəsi olurlar. İndi - hər şey qaydasında.

JEP 359: Qeydlər

Qeydlər kimi tanınan qeydlər JDK 14 üçün önizləmə rejimində mövcuddur və bu, Java üçün tamamilə yeni bir şeydir. Əslində qarşımızda Valhalla layihəsi zamanı hazırlanmış yeni bir tip var . Qeydlər sadalamalara bənzəyir və kodunuzu sadələşdirməyə imkan verir. Əslində, onlar vəziyyəti olan, lakin davranışı olmayan sinifləri əvəz edirlər. Sadəcə olaraq, sahələr var, üsullar yoxdur. Dərslər vəziyyətində biz bəzən həmişə lazım olmayan çoxlu təkrarlanan kod yazmalıyıq: konstruktorlar, köməkçilər, equals(), hashCode(), toString() və s. Bu təkrarlanan kodun qarşısını almaq üçün Java planları rekord istifadə etmək. Budur klassik versiya:
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
Gəlin Java 14-ə keçək və qeyddən istifadə edək:
public record Triangle(int x, int y, int z){}
Hamısı budur. Nəzərə alın ki, qeydlər hazırda ilkin baxış formasında mövcuddur, ona görə də onları praktikada sınamaq üçün jdk14-ü yükləməli və əmri daxil etməlisiniz:
javac —enable-preview —release 14 Triangle.java
Məhdudiyyətlər olsa da, qeydlər siniflərdir. Onlar digər sinifləri genişləndirə və ya sahələri elan edə bilməzlər (dövlət bəyannaməsi komponentlərinə uyğun gələn özəl yekun istisna olmaqla). Qeydlər dolayısı ilə yekundur və mücərrəd ola bilməz. Qeydlər adi siniflərdən onunla fərqlənir ki, onlar API-ni onun təmsilindən ayıra bilmirlər. Lakin azadlıq itkisi artan dəqiqliklə kompensasiya olunur. Qeyd komponentləri də dolayısı ilə yekundur.

JEP 305: Nümunə üçün Nümunə Uyğunluğu (Ön baxış)

Java 14-də ilkin baxışda təqdim edilən Pattern Matching funksiyası obyektin növünün yoxlanılmasını və instanceof operatorunda onun çevrilməsini birləşdirmək üçün nəzərdə tutulmuşdur. Başqa sözlə, Java 14-dən əvvəl, məsələn, aşağıdakı kod olardı:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
Gördüyünüz kimi, obyekti metodlarından istifadə etmək istədiyimiz sinfə köçürməliyik. İndi Java 14 və əlaqəli Pattern Matching funksiyası kodu aşağıdakılara endirməyə imkan verir:
Object object = Violin;

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

JEP 343: Qablaşdırma Aləti (İnkubator)

JDK 8-də JavaFX üçün nəzərdə tutulmuş javapackager aləti var idi. Bununla belə, JDK 11-in buraxılması ilə JavaFX-in Java-dan ayrılmasından sonra məşhur javapackager artıq mövcud deyildi. Javapackager qablaşdırma vasitəsi idi. Bu, Java proqramlarının bütün digər "normal" proqramlar kimi quraşdırıla biləcək şəkildə paketlənməsinə imkan verdi. Məsələn, Windows istifadəçiləri üçün exe faylları yaradın və insan kimi Java proqramını işə salın - cüt kliklə. Əlbəttə ki, belə bir alət çox azdır, ona görə də JEP 343 Java proqramını bütün lazımi asılılıqları ehtiva edən platformaya məxsus paketə paketləyən yeni jpackage alətini təqdim etdi. Müəyyən bir platforma üçün dəstəklənən paket formatları:
  • Linux: deb və rpm
  • macOS: pkg və dmg
  • Windows: MSI və EXE

JEP 345: G1 üçün NUMA-Aware Yaddaş Ayrılması

JEP 345 yalnız NUMA (Qeyri-vahid yaddaşa giriş) dəstəyini həyata keçirmək üçün xidmət edir. Bunlar yaddaşa girişin heterojen arxitekturalarıdır, mikroprosessor klasterini yaddaşın lokal olaraq paylana bildiyi çoxprosessorlu sistemə qurmaq üsuludur: hər bir prosessor nüvəsi az miqdarda yerli yaddaş alır, digər nüvələr isə ona daxil olur. JEP 345 bu cür arxitekturalardan istifadə etmək üçün G1 zibil kollektorunu təchiz etməyi planlaşdırır. Digər şeylər arasında, bu yanaşma çox güclü maşınlarda performansı yaxşılaşdırmağa kömək edir.

JEP 349: JFR Hadisə axını

Java Uçuş Recorder (JFR) indi OpenJDK-nın bir hissəsidir və buna görə də sərbəst mövcuddur. JDK 14, xüsusən də aktiv və qeyri-aktiv tətbiqlərin davamlı monitorinqini təşkil etmək üçün JFR hadisələrinin anında izlənilməsi (JDK Uçuş Recorder) üçün API əlavə edir. Eyni hadisələr yayımlanmayan seçim üçün olduğu kimi qeydə alınır, əlavə xərc 1%-dən azdır. Bu yolla hadisələr yayımlanmayan seçimlə eyni vaxtda yayımlanacaq. Bununla belə, JEP 349 müvafiq istehlakçı üçün sinxron geri çağırışlara icazə verməməlidir. Aralıq yaddaşda saxlanılan qeydlərdən alınan məlumatlar belə əlçatan olmamalıdır. Texniki olaraq, jdk.jfr modulundakı jdk.jfr.consumer paketi hadisələrə asinxron giriş üçün funksionallıqla genişləndiriləcək.

JEP 352: Qeyri-uçucu Xəritəli Bayt Buferləri

Bildiyiniz kimi, Java NIO (Yeni İO) Fayl API-si JDK 1.4-dən bəri mövcuddur və sonra Path adlı yeni təkmilləşdirmə təqdim edilmişdir. Path, Java NIO-da işlədiyimiz zaman fayl və ya kataloqun təsviri kimi java.io.File sinifini əvəz edən interfeysdir. JEP 352 fayl məlumatlarının bir hissəsini uçucu olmayan yaddaşa (NVM) yükləmək üçün MappedByteBuffer-i genişləndirir. Enerji söndürülsə belə məlumatların itirilməyəcəyi bu kompüter yaddaşı (çox vaxt yalnız oxumaq üçün yaddaş adlanır) məlumatları daimi saxlamaq üçün istifadə olunur. Bu Java təkmilləşdirmə təklifi JDK API üçün yeni modul və sinif təqdim edir: jdk.nio.mapmode modulu, NVM-ə istinad edən xəritələnmiş bayt buferləri (MappedByteBuffer) yaratmaq üçün yeni rejimlər (READ_ONLY_SYNC, WRITE_ONLY_SYNC) təklif edir.

JEP 358: Faydalı NullPointer İstisnaları

NullPointerExceptions indi daha çox proqramçıya uyğun olacaq. O mənada ki, istisnanın təsviri əvvəlkindən daha informativ olacaq. Bunun səbəbi, JVM-ə proqram bayt kodu təlimatlarını daha dəqiq təhlil etmək öyrədilmişdir və o, hansı dəyişənin sıfır dəyərə səbəb olduğunu göstərə bilər. Deyək ki, kodumuz var:
a.getMessage().getUserInfo().getName()
Ən son Java-nın hər hansı birində biz adi səhv jurnalını alacağıq, bu da kimin boş olduğu sualına cavab vermir:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
Bu önizləmə funksiyasını sınamaq qərarına gəlsəniz, Java 14 sizə nə verəcək:
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 zəncir daha başa düşüləndir və səhvi daha sürətli həll etməyə imkan verir.

JEP 361: İfadələri dəyişdirin (Standart)

Yenilənmiş Switch operatoru əvvəlki Java 12 və 13-də mövcud idi, lakin yalnız bir önizləmə funksiyası kimi, yəni defolt olaraq aktiv deyildi. İndi JDK 14-də hər şey qutunun xaricində işləyir. Java 14 L -> ... işarələri ilə keçid blokunun yeni sadələşdirilmiş formasını təqdim edir.Yeni forma bəzi hallarda kodu sadələşdirir. Burada bir neçə nümunə var. Tutaq ki, həftənin günlərini təsvir edən bir nömrəmiz var. Biz klassik kodu yaza bilərik (Java 14-dən əvvəl):
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;
}
Və burada Java 14 istifadə edən bir seçim var:
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);
}
Siz həmçinin çox sətirli bloklar yaza və yeni gəlir açar sözü ilə dəyər qaytara bilərsiniz:
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;
    }
};
Yeni keçiddən istifadə edərkən nəzərə alınmalı olan daha bir neçə vacib şey var . Xüsusilə, seçimlərin hərtərəfli olması lazım olduğunu xatırlamaq lazımdır. Yəni, bütün mümkün dəyərlər üçün müvafiq keçid etiketi olmalıdır. Gəlir indi açar söz olduğundan , Java 14-də yield adlı sinif mümkündür. Ümumiyyətlə, yenilənmiş keçidlərdən necə istifadə edəcəyinizi öyrənmək istəyirsinizsə, JEP 361- ə keçin və öyrənin. Orada çox maraqlı məlumatlar var.

JEP 362: Solaris və SPARC Portlarını ləğv edin

Oxucularımızın çoxunun Solaris əməliyyat sistemi haqqında xatırlaması çətin ki . Java-nın valideynləri Sun Microsystems tərəfindən yaradılmış bu UNIX-əsaslı əməliyyat sistemi əsasən SPARC arxitekturasındakı serverlər üçün istifadə edilmişdir... Hər kvadrat santimetrə çox tanış olmayan sözlər varmı? Böyük bir şey yoxdur: JEP 362 Solaris/SPARC, Solaris/x64 və Linux/SPARC platformalarına dəstəyi dayandırır. Yəni, onların portları indi köhnəlmişdir və gələcəkdə onlar çox güman ki, OpenJDK-dan silinəcəklər. Bununla belə, Solaris/SPARC, Solaris/x64 və Linux/SPARC portları ilə bağlı Java-nın köhnə versiyaları (JDK 14-dən əvvəl) dəyişiklik edilmədən işləməlidir. Əgər siz tarix həvəskarısınızsa və o qədər də uzaq olmayan keçmişin texnologiyaları ilə maraqlanırsınızsa, Vikipediyaya daxil olun və SPARС arxitekturası haqqında oxuyun .

JEP 363: Concurrent Mark Sweep (CMS) Zibil Kollektorunu çıxarın

CMS zibil toplayıcısı (Concurrent Mark Sweep) silinmək üçün nəzərdə tutulub, çünki iki il əvvəl o, köhnəlmiş kimi qeyd edilib və baxımsız qalıb. Bununla belə, CMS GC-dən istifadə edən Java-nın köhnə versiyalarının istifadəçiləri nəfəs ala bilərlər - bu JEP-in məqsədi qurucuyu əvvəlki JDK buraxılışlarından silmək deyil. Bundan əlavə, ParallelScavenge və SerialOld zibil toplama alqoritmlərinin birləşməsi (“-XX:+UseParallelGC -XX:-UseParallelOldGC” seçimləri ilə işləyir) köhnəlmişdir.

JEP 364: macOS-da ZGCWindows-da JEP 365: ZGC

Z Garbage Collector (ZGC) adlı maraqlı bir zibil yığan var . O, passiv rejimdə işləyir və zibil yığılması ilə əlaqədar gecikmələri minimuma endirməyə çalışır: ZGC-dən istifadə zamanı dayanma müddəti 10 ms-dən çox deyil. Kiçik yığınlarla və nəhənglərlə (çox terabayt tutanlarla) işləyə bilər. JEP 364 və JEP 365 praktiki olaraq əkizdir. JEP 364 Z Garbage Collector-u MacOS-a gətirir. JEP-in bir hissəsi JEP 351- də göstərildiyi kimi istifadə olunmamış cihaz yaddaşını boşaltmaq üçün kollektor funksiyasını da təsvir edir , bu, Java 13-dən bəri baş verir. MacOS-da ZGC tətbiqi iki hissədən ibarətdir:
  • MacOS-da multi-mapping yaddaş dəstəyi
  • Davamlı yaddaş rezervasiyası üçün ZGC dəstəyi
JEP 365 artıq Windows-da, həmçinin eksperimental rejimdə ZGC-yə dəstək verir. Bu aşağıdakı kimidir:
  • Multi-mapping yaddaş dəstəyi
  • Səhifə faylı əsasında ayrılmış ünvan sahəsinə yaddaş xəritələşdirilməsinə dəstək
  • Yığın ixtiyari hissələrinin xəritələşdirilməsi və xəritədən çıxarılması üçün dəstək
  • Yığın ixtiyari hissələrinin qəbul edilməsi və silinməsi üçün dəstək

JEP 366: ParallelScavenge + SerialOld GC Kombinasiyasını ləğv edin

Bu JEP Parallel Scavenge və Serial Old zibil toplama alqoritmlərinin birləşməsini ləğv edir. Bu kombinasiya -XX: + UseParallelGC -XX: -UseParallelOldGC parametrləri ilə əl ilə aktivləşdirilməli idi. Müəlliflər kombinasiyanın çox spesifik olduğuna inanırlar, eyni zamanda əhəmiyyətli texniki səy tələb edir. Beləliklə, indi -XX: UseParallelOldGC seçimi köhnəlib və istifadə olunarsa, xəbərdarlıq görünəcək.

JEP 367: Pack200 Alətləri və API-ni çıxarın

Pack200 tərtib edilmiş Java sinif fayllarını saxlamaq üçün optimallaşdırılmış arxiv formatıdır. Bu alət Java 11-dən bəri köhnəlmiş kimi qeyd olunub. pack200, unpack200 və Pack200 API alətləri indi rəsmi olaraq java.util.jar paketindən çıxarılır . Bu texnologiya çox məhdud bant genişliyi (modemlər, demək və xatırlamaq qorxuludur, 56k) və sabit disklərdə qeyri-kafi yaddaş sahəsi ilə mübarizə vasitəsi kimi yenidən Java 5-də təqdim edilmişdir. Bir müddət əvvəl Java 9 yeni sıxılma sxemlərini təqdim etdi. Tərtibatçılara jlink istifadə etmək tövsiyə olunur .

JEP 368: Mətn Blokları (İkinci Ön Baxış)

Mətn blokları ilk dəfə Java 13-də peyda oldu. Onlar çox sətirli sətir literallarıdır ki, əksər qaçış ardıcıllığına ehtiyacın qarşısını alır, sətri avtomatik formatlayır və həmçinin lazım olduqda tərtibatçıya sətri formatlamağa imkan verir. Bu faydalı funksiya indi Java 14-də mövcuddur (2-ci Preview). Mətn bloklarının əsas məqsədi çaşqınlıq yaradan çoxsətirli hərflərin işlənməsini təkmilləşdirməkdir. Bu, SQL sorğularını, HTML və XML kodunu və JSON-u oxumağı və yazmağı xeyli asanlaşdırır. Mətn blokları olmayan HTML nümunəsi:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
Eyni şeyi mətn blokları ilə necə təmsil etmək olar:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
Açılış ayırıcı üç qoşa dırnaq simvolundan ("" "), ardınca sıfır və ya daha çox boşluqdan və sonra sətir ayırıcıdan ibarət ardıcıllıqdır. Məzmun açılış ayırıcısının sətir ayırıcısından sonrakı birinci simvoldan başlayır. Bağlayıcı ayırıcı üç qoşa dırnaq işarəsi " seçilmişdir ki, simvollar qaçmadan göstərilə bilsin, həmçinin mətn blokunu sətir hərfidən vizual olaraq fərqləndirə bilsin. 2019-cu ilin əvvəlində JEP 355 JEP 326-nın (Raw String hərfi) davamı olaraq mətn bloklarını təklif etdi, lakin onlar geri götürüldü. Həmin ilin sonunda JDK 13 mətn blokunun önizləmə xüsusiyyətini təqdim etdi və indi Java 14 iki yeni qaçış ardıcıllığı əlavə etdi. Bu, \ ilə işarələnmiş sətir-terminatordur, ikincisi isə /s ilə işarələnmiş tək boşluq üçündür. Mətn blokları olmadan yeni sətirlərdən istifadə nümunəsi:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
İndi \<line-terminator> qaçış ardıcıllığı ilə:
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
Qaçış ardıcıllığı \s , defolt olaraq kompilyator tərəfindən nəzərə alınmayan arxa boşluqları hesablamaq üçün istifadə olunur. O, özündən əvvəlki bütün boşluqları qoruyur. Misal:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1text2eynidirlər.

JEP 370: Xarici Yaddaş Girişi API (İnkubator)

Bir çox məşhur Java kitabxanaları və proqramları xarici yaddaşa çıxışı var. Məsələn, Ignite, MapDB, Memcached və Netty ByteBuf API. Bununla onlar zibilin yığılması ilə bağlı xərclərdən və gözlənilməzlikdən qaça bilərlər (xüsusilə böyük keşlərə xidmət göstərərkən), yaddaşı çoxsaylı proseslər arasında bölüşdürə və yaddaşdakı faylları xəritələşdirməklə (məsələn, mmap-dan istifadə etməklə) yaddaş məzmununu seriallaşdıra və sıradan çıxara bilərlər. Bununla belə, Java API-də hələ də xarici yaddaşa daxil olmaq üçün uyğun həll yoxdur. JDK 14 Java proqramlarına yeni MemorySegment, MemoryAddress və MemoryLayout abstraksiyalarından istifadə edərək JVM yığınından kənar yaddaş bölgələrinə təhlükəsiz və səmərəli daxil olmağa imkan verən Xarici Yaddaş Girişi API- nin önizləməsini ehtiva edir .

nəticələr

Belə ki, nə düşünürsünüz? Java 13 ilə müqayisədə yeni Java 14 müxtəlif sahələrdə daha çox mühüm təkmilləşdirmələr təklif edir. Çox güman ki, tərtibatçılar üçün ən vacib olan yenilənmiş keçid, genişləndirilmiş istisnalar NullPointerExceptions və qeydlər olacaq. Yoxsa yox?.. Java 14-ün yeni xüsusiyyətlərini sınamağı unutmayın, hətta yeni başlayanlar üçün də çox faydalıdır. Təhsilinizdə uğurlar!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION