JavaRush /Java blogi /Random-UZ /Java 14: nima yangilik?

Java 14: nima yangilik?

Guruhda nashr etilgan
Dunyo muammolari - bu dunyo muammolari va yangi Java jadvalga muvofiq. Ya'ni, har olti oyda bir marta. Java 14-ning reliz versiyasi 17-mart kuni chiqarildi va dasturchilarga qaratilgan tilga bir nechta qiziqarli yangiliklarni taqdim etdi. Ular orasida rekordJava 14: nima yangilik?  - 1 kalit so'zni eksperimental qo'llab-quvvatlash, " instanceof " operatorida naqsh moslashtirishni qo'llab-quvvatlash , yanada qulayroq NullPointerExceptions , matn bloklarini kengaytirilgan "oldindan ko'rish" , yangilangan standart kalit va boshqalar mavjud. Eslatib o'tamiz, Java-dagi barcha innovatsiyalar kengaytma takliflari ( JEP, Java Enhancement Proposals ) bilan boshlanadi. Ishlab chiquvchilar o'zgarishlarni taklif qiladilar, ular "rasmiy" Java ota-onalari tomonidan ko'rib chiqiladi va keyin ushbu o'zgarishlarning ba'zilari qabul qilinadi, shundan so'ng ular JDK tarkibiga kiradi. Va endi - hamma narsa tartibda.

JEP 359: Yozuvlar

Yozuvlar sifatida ham tanilgan yozuvlar JDK 14 uchun oldindan ko'rish rejimida mavjud va bu Java uchun mutlaqo yangi narsa. Aslida, bizning oldimizda Valhalla loyihasi davomida ishlab chiqilgan yangi tur mavjud . Yozuvlar ro'yxatga olishlarga o'xshaydi va kodingizni soddalashtirishga imkon beradi. Asosan, ular holati bo'lgan, ammo xatti-harakati bo'lmagan sinflarni almashtiradilar. Oddiy qilib aytganda, maydonlar mavjud, usullar yo'q. Sinflar uchun biz ba'zan juda ko'p takrorlanadigan kodlarni yozishga to'g'ri keladi, bu har doim ham kerak bo'lmaydi: konstruktorlar, yordamchilar, equals(), hashCode(), toString() va boshqalar. Bunday takrorlanadigan kodni oldini olish uchun Java rejalashtirmoqda. yozuvdan foydalanish. Mana 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
Keling, Java 14 ga o'tamiz va rekorddan foydalanamiz:
public record Triangle(int x, int y, int z){}
Ana xolos. Yozuvlar hozirda oldindan ko'rish shaklida mavjudligini unutmang, shuning uchun ularni amalda sinab ko'rish uchun jdk14 ni yuklab olishingiz va buyruqni kiritishingiz kerak:
javac —enable-preview —release 14 Triangle.java
Yozuvlar cheklovlar bilan bo'lsa-da, sinflardir. Ular boshqa sinflarni kengaytira olmaydi yoki maydonlarni e'lon qila olmaydi (davlat deklaratsiyasining tarkibiy qismlariga mos keladigan xususiy finaldan tashqari). Yozuvlar aniq yakuniy hisoblanadi va mavhum bo'lishi mumkin emas. Yozuvlar oddiy sinflardan farq qiladi, chunki ular o'zlarining API-larini taqdimotidan ajrata olmaydilar. Ammo erkinlikni yo'qotish aniqlikning oshishi bilan qoplanadi. Yozuv komponentlari ham bilvosita yakuniy hisoblanadi.

JEP 305: namuna uchun naqsh moslashuvi (oldindan ko'rish)

Java 14 da oldindan koʻrishda taqdim etilgan Pattern Matching xususiyati obyekt turini tekshirish va uni instanceof operatorida oʻzgartirishni birlashtirish uchun moʻljallangan . Boshqacha qilib aytganda, Java 14 dan oldin, masalan, quyidagi kod mavjud edi:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
Ko'rib turganingizdek, biz ob'ektni usullaridan foydalanmoqchi bo'lgan sinfga yuborishimiz kerak. Endi Java 14 va ulangan Pattern Matching xususiyati kodni quyidagilarga qisqartirish imkonini beradi:
Object object = Violin;

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

JEP 343: Qadoqlash vositasi (inkubator)

JDK 8 da JavaFX uchun mo'ljallangan javapackager vositasi mavjud edi. Biroq, JDK 11-ning chiqarilishi bilan JavaFX Java-dan ajratilgandan so'ng, mashhur javapackager endi mavjud emas edi. Javapackager qadoqlash vositasi edi. Bu Java ilovalarini boshqa barcha "oddiy" dasturlar kabi o'rnatilishi mumkin bo'lgan tarzda paketlash imkonini berdi. Masalan, Windows foydalanuvchilari uchun exe fayllarini yarating va Java dasturini inson kabi ishga tushiring - ikki marta bosish bilan. Albatta, bunday vosita juda kam, shuning uchun JEP 343 yangi jpackage vositasini taqdim etdi , u Java dasturini barcha kerakli bog'liqliklarni o'z ichiga olgan platformaga xos paketga jamlaydi. Muayyan platforma uchun qo'llab-quvvatlanadigan paket formatlari:
  • Linux: deb va rpm
  • macOS: pkg va dmg
  • Windows: MSI va EXE

JEP 345: G1 uchun NUMA-aware xotira ajratish

JEP 345 faqat NUMA (Xotiraga yagona bo'lmagan kirish) qo'llab-quvvatlashini amalga oshirish uchun xizmat qiladi. Bular xotiraga kirishning heterojen arxitekturalari, mikroprotsessorli klasterni xotira lokal ravishda taqsimlanishi mumkin bo'lgan ko'p protsessorli tizimga o'rnatish usuli: har bir protsessor yadrosi kichik hajmdagi mahalliy xotirani oladi, boshqa yadrolar esa unga kirish huquqiga ega. JEP 345 G1 axlat yig'uvchisini bunday arxitekturalardan foydalanish uchun jihozlashni rejalashtirmoqda. Boshqa narsalar qatorida, bu yondashuv juda kuchli mashinalarda ishlashni yaxshilashga yordam beradi.

JEP 349: JFR voqealar oqimi

Java Flight Recorder (JFR) endi OpenJDK tarkibiga kiradi va shuning uchun bepul mavjud. JDK 14 JFR hodisalarini tezkor kuzatish (JDK Flight Recorder), xususan faol va nofaol ilovalarning doimiy monitoringini tashkil qilish uchun API qo'shadi. Xuddi shu hodisalar 1% dan kam bo'lgan qo'shimcha xarajatlar bilan oqimsiz variant uchun qayd etiladi. Shunday qilib, voqealar oqimsiz opsiya bilan bir vaqtda uzatiladi. Biroq, JEP 349 mos keladigan iste'molchi uchun sinxron qayta qo'ng'iroqlarga ruxsat bermasligi kerak. Hatto oraliq xotirada saqlangan yozuvlardan olingan ma'lumotlarga kirish imkoni bo'lmasligi kerak. Texnik jihatdan jdk.jfr.consumer paketi jdk.jfr modulidagi hodisalarga asinxron kirish funksiyasi bilan kengaytiriladi.

JEP 352: O'zgaruvchan bo'lmagan xaritalangan bayt buferlari

Ma'lumki, Java NIO (Yangi IO) File API JDK 1.4 dan beri mavjud bo'lib, keyin Path deb nomlangan yangi takomillashtirish taqdim etildi. Path - Java NIO da ishlaganimizda fayl yoki katalogning ko'rinishi sifatida java.io.File sinfini almashtiradigan interfeys. JEP 352 fayl ma'lumotlarining bir qismini doimiy xotiraga (NVM) yuklash uchun MappedByteBuffer-ni kengaytiradi. Elektr o'chirilgan bo'lsa ham ma'lumotlar yo'qolmaydigan ushbu kompyuter xotirasi (ko'pincha faqat o'qish uchun xotira deb ataladi) ma'lumotlarni doimiy saqlash uchun ishlatiladi. Ushbu Java takomillashtirish taklifi JDK API uchun yangi modul va sinfni taqdim etadi: jdk.nio.mapmode moduli, u NVMga havola qilingan bayt buferlarini (MappedByteBuffer) yaratish uchun yangi rejimlarni (READ_ONLY_SYNC, WRITE_ONLY_SYNC) taklif etadi.

JEP 358: Foydali NullPointer istisnolari

NullPointerExceptions endi dasturchilarga ko'proq mos keladi. Istisnoning tavsifi avvalgidan ko'ra ko'proq ma'lumotli bo'ladi degan ma'noda. Buning sababi shundaki, JVM dastur bayt-kod ko'rsatmalarini aniqroq tahlil qilishga o'rgatilgan va u qaysi o'zgaruvchining nol qiymatiga olib kelishini ko'rsatishi mumkin. Aytaylik, bizda kod bor:
a.getMessage().getUserInfo().getName()
Eng so'nggi Java-ning har qandayida biz odatiy xato jurnalini olamiz, bu kim aniq null degan savolga javob bermaydi:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
Va agar siz ushbu oldindan ko'rish xususiyatini sinab ko'rishga qaror qilsangiz, Java 14 sizga nima beradi:
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)
Ushbu zanjir ancha tushunarli va xatoni tezroq hal qilishga imkon beradi.

JEP 361: Ifodalarni almashtirish (standart)

Yangilangan Switch operatori avvalgi Java 12 va 13 da mavjud edi, lekin faqat oldindan ko'rish funksiyasi sifatida, ya'ni u sukut bo'yicha yoqilmagan. Endi JDK 14 da hamma narsa qutidan tashqarida ishlaydi. Java 14 kommutator blokining yangi soddalashtirilgan shaklini L -> ... yorliqlari bilan taqdim etadi.Yangi shakl ayrim hollarda kodni soddalashtiradi. Mana bir nechta misol. Aytaylik, bizda haftaning kunlarini tavsiflovchi raqam bor. Biz klassik kodni yozishimiz mumkin (Java 14-dan oldingi):
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;
}
Va bu erda Java 14 dan foydalanadigan variant:
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);
}
Shuningdek, siz ko'p qatorli bloklarni yozishingiz va new yield kalit so'zi bilan qiymatni qaytarishingiz mumkin:
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;
    }
};
Yangi kalitdan foydalanishda yana bir nechta muhim narsalarni yodda tutish kerak s . Xususan, variantlar to'liq bo'lishi kerakligini esdan chiqarmasligingiz kerak. Ya'ni, barcha mumkin bo'lgan qiymatlar uchun mos keladigan kalit belgisi bo'lishi kerak. Endi yield kalit so'z bo'lgani uchun Java 14 da yield nomli sinf mavjud. Umuman olganda, agar siz yangilangan kalitlardan qanday foydalanishni o'rganmoqchi bo'lsangiz, JEP 361 ga o'ting va o'rganing. U erda juda ko'p qiziqarli ma'lumotlar mavjud.

JEP 362: Solaris va SPARC portlarini bekor qiling

Ko'pgina o'quvchilarimiz Solaris operatsion tizimi haqida eslashlari dargumon . Java-ning ota-onasi Sun Microsystems tomonidan yaratilgan ushbu UNIX-ga asoslangan operatsion tizim asosan SPARC arxitekturasidagi serverlar uchun ishlatilgan... Bir kvadrat santimetr uchun juda ko'p notanish so'zlar bormi? Hech qanday muammo yo'q: JEP 362 Solaris/SPARC, Solaris/x64 va Linux/SPARC platformalarini qo'llab-quvvatlashni tugatadi. Ya'ni, ularning portlari endi eskirgan va kelajakda ular OpenJDK dan olib tashlanishi mumkin. Biroq, Solaris/SPARC, Solaris/x64 va Linux/SPARC portlariga tegishli Java-ning eski versiyalari (JDK 14 dan oldingi) o'zgartirishlarsiz ishlashi kerak. Agar siz tarix ishqibozi bo'lsangiz va unchalik uzoq bo'lmagan o'tmish texnologiyalariga qiziqsangiz, Vikipediyaga o'ting va SPARS arxitekturasi haqida o'qing .

JEP 363: Bir vaqtning o'zida Mark Sweep (CMS) axlat yig'uvchisini olib tashlang

CMS axlat yig'uvchisi (Concurrent Mark Sweep) olib tashlash uchun mo'ljallangan, chunki ikki yil oldin u eskirgan deb belgilangan va parvarish qilinmagan. Biroq, CMS GC-dan foydalangan holda Java-ning eski versiyalari foydalanuvchilari nafas olishlari mumkin - bu JEPning maqsadi avvalgi JDK relizlaridan quruvchini olib tashlash emas. Bundan tashqari, ParallelScavenge va SerialOld axlat yig'ish algoritmlari kombinatsiyasi ("-XX:+UseParallelGC -XX:-UseParallelOldGC" opsiyalari bilan ishlaydi) eskirgan.

JEP 364: macOS’da ZGC va Windows’da JEP 365: ZGC

Z Garbage Collector (ZGC) deb nomlangan qiziqarli axlat yig'uvchi mavjud . U passiv rejimda ishlaydi va axlat yig'ish bilan bog'liq kechikishlarni minimallashtirishga harakat qiladi: ZGC dan foydalanishda to'xtash vaqti 10 ms dan oshmaydi. U kichik uyumlar va gigantlar (ko'p terabaytlarni egallaganlar) bilan ishlashi mumkin. JEP 364 va JEP 365 deyarli egizaklardir. JEP 364 Z Garbage Collector-ni MacOS-ga olib keladi. JEPning bir qismi JEP 351 da ko'rsatilganidek, foydalanilmagan qurilma xotirasini bo'shatish uchun kollektor funksiyasini ham tasvirlaydi , bu Java 13-dan beri sodir bo'lmoqda. MacOS-da ZGC ilovasi ikki qismdan iborat:
  • MacOS-da ko'p xaritalash xotirasini qo'llab-quvvatlash
  • Doimiy xotirani zahiralash uchun ZGC qo'llab-quvvatlash
JEP 365 ZGC-ni Windows-da, shuningdek, eksperimental rejimda qo'llab-quvvatlaydi. Bu quyidagicha:
  • Ko'p xaritalash xotirasini qo'llab-quvvatlash
  • Sahifa fayli asosida ajratilgan manzil maydoniga xotira xaritasini qo'llab-quvvatlash
  • Uyumning ixtiyoriy qismlarini xaritalash va xaritadan chiqarishni qo'llab-quvvatlash
  • Uyumning o'zboshimchalik bilan qismlarini qo'llash va o'chirishni qo'llab-quvvatlash

JEP 366: ParallelScavenge + SerialOld GC kombinatsiyasini bekor qilish

Ushbu JEP Parallel Scavenge va Serial Old axlat yig'ish algoritmlarining kombinatsiyasini bekor qiladi. Bu kombinatsiyani -XX: + UseParallelGC -XX: -UseParallelOldGC parametrlari yordamida qo'lda yoqish kerak edi. Mualliflarning fikriga ko'ra, kombinatsiya juda o'ziga xosdir, lekin ayni paytda katta parvarishlash harakatlarini talab qiladi. Shunday qilib, endi -XX: UseParallelOldGC opsiyasi eskirgan va agar foydalanilsa, ogohlantirish paydo bo'ladi.

JEP 367: Pack200 vositalari va APIni olib tashlang

Pack200 kompilyatsiya qilingan Java sinf fayllarini saqlash uchun optimallashtirilgan arxiv formatidir. Ushbu vosita Java 11-dan beri eskirgan deb belgilangan. Endi pack200, unpack200 va Pack200 API vositalari java.util.jar to'plamidan olib tashlash uchun rasman e'lon qilindi . Ushbu texnologiya Java 5 da juda cheklangan tarmoqli kengligi (modemlar, aytish va eslash qo'rqinchli, 56k) va qattiq disklarda etarli joy yo'qligi bilan kurashish vositasi sifatida kiritilgan. Bir muncha vaqt oldin Java 9 yangi siqish sxemalarini taqdim etdi. Ishlab chiquvchilarga jlink dan foydalanish tavsiya etiladi .

JEP 368: Matn bloklari (ikkinchi ko'rib chiqish)

Matn bloklari birinchi marta Java 13 da paydo bo'lgan. Ular ko'p qatorli satr literallari bo'lib, ko'pchilik qochish ketma-ketliklariga bo'lgan ehtiyojni oldini oladi, satrni avtomatik ravishda formatlaydi va kerak bo'lganda ishlab chiquvchiga qatorni formatlash imkonini beradi. Ushbu foydali xususiyat endi Java 14 da mavjud (2-ko'rib chiqish). Matn bloklarining asosiy maqsadi chalkash ko'p qatorli harflar bilan ishlashni yaxshilashdir. Bu SQL so'rovlarini, HTML va XML kodlarini va JSONni o'qish va yozishni sezilarli darajada osonlashtiradi. Matn bloklarisiz HTML misoli:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
Matn bloklari bilan bir xil narsani qanday ko'rsatish mumkin:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
Ochish chegarasi uchta qo'sh tirnoqli belgilar ketma-ketligidir ("" "), undan keyin nol yoki undan ko'p bo'sh joy, so'ngra qator ajratgich. Tarkib ochuvchi chegaralovchining satr ajratuvchisidan keyingi birinchi belgidan boshlanadi. Yakunlovchi ajratuvchi - bu Belgilar qochmasdan ko'rsatilishi, shuningdek, matn blokini satr literalidan vizual ravishda ajratish uchun uchta qo'sh tirnoqli belgilar ketma-ketligi " _ ) tanlangan. 2019 yil boshida JEP 355 matn bloklarini JEP 326 (Raw String literal) ning davomi sifatida taklif qildi, ammo ular olib tashlandi. O'sha yilning oxirida JDK 13 matn bloklarini oldindan ko'rish xususiyatini taqdim etdi va endi Java 14 ikkita yangi qochish ketma-ketligini qo'shdi. Bu chiziq-terminator bo'lib, \ bilan belgilanadi, ikkinchisi esa bitta bo'shliq uchun, /s bilan belgilanadi. Matn bloklarisiz yangi qatorlardan foydalanishga misol:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
Va endi qochish ketma-ketligi bilan \<line-terminator>:
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
Escape ketma-ketligi \s orqadagi bo'shliqni hisobga olish uchun ishlatiladi, bu kompilyator tomonidan sukut bo'yicha e'tiborga olinmaydi. U o'zidan oldingi barcha bo'shliqlarni saqlaydi. Misol:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1va text2bir xil.

JEP 370: Tashqi xotiraga kirish API (inkubator)

Ko'pgina mashhur Java kutubxonalari va dasturlari tashqi xotiradan foydalanish imkoniyatiga ega. Masalan, Ignite, MapDB, Memcached va Netty ByteBuf API. Bunda ular axlat yig'ish (ayniqsa katta keshlarga xizmat ko'rsatishda) bilan bog'liq xarajat va oldindan aytib bo'lmaydigan holatlardan qochishlari mumkin, xotirani bir nechta jarayonlar bo'ylab almashishlari va xotiradagi fayllarni xaritalash (masalan, mmap yordamida) orqali xotira tarkibini seriyalashtirish va seriyadan chiqarish mumkin. Biroq, Java API hali ham tashqi xotiraga kirish uchun mos echimga ega emas. JDK 14 Java ilovalariga yangi MemorySegment, MemoryAddress va MemoryLayout abstraktsiyalari yordamida JVM to'plamidan tashqaridagi xotira hududlariga xavfsiz va samarali kirish imkonini beruvchi Tashqi xotiraga kirish API ni oldindan ko'rishni o'z ichiga oladi.

xulosalar

Xo'sh, nima deb o'ylaysiz? Java 13 bilan taqqoslaganda, yangi Java 14 turli sohalarda ko'plab muhim yaxshilanishlarni taklif etadi. Ehtimol, ishlab chiquvchilar uchun eng muhimi yangilangan kalit, kengaytirilgan istisnolar NullPointerExceptions va yozuvlar bo'ladi. Yoki yo'qmi?.. Java 14 ning yangi funksiyalarini sinab ko'rishni unutmang, u hatto yangi boshlanuvchilar uchun ham juda foydali. O'qishlaringizga omad!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION