JavaRush /Java blogi /Random-UZ /Java 13: Yangi xususiyatlar

Java 13: Yangi xususiyatlar

Guruhda nashr etilgan
Biz har olti oyda yangi JDK relizi paydo bo'lishiga allaqachon ko'nikib qolganmiz. Hozircha bu yondashuv o‘zini oqladi va ba’zi ishlab chiquvchilarning yangilanishlardan xabardor bo‘lmasliklari haqidagi xavotirlari behuda bo‘ldi: olti oylik o‘zgarishlar kam va ular avvalgidek global emas. Ajam dasturchilar yangilikni umuman sezmasligi mumkin. Java 13: yangi xususiyatlar - 1Biroq, bo'lajak dasturiy ta'minot ishlab chiqaruvchilari yangiliklardan xabardor bo'lishlari yaxshiroqdir. Ushbu maqolada biz an'anaviy ravishda qabul qilingan kengaytma takliflarini (JEPs) tasvirlab beramiz. Java 13 faqat beshta JEP va 76 ta yangi asosiy kutubxona elementlarini o'z ichiga oladi (ulardan deyarli yarmi java.io paketiga oddiy qo'shimchalar).

JEP 355 : Matn bloklari (oldindan ko'rish)

Keling, tilning sintaksisini o'zgartirishdan boshlaylik. Ulardan eng muhimi matn bloklaridir. Ular sizga qochib ketayotgan belgilardan qochish va satrlarni qanday formatlashni bilish imkonini beradi. Esingizda bo'lsa , JDK 12 string literallari bilan ishlash uchun kutilgan Raw String Literals (JEP 326) xususiyatini o'z ichiga olmagan. Java 13 da u matn bloklari bilan JEP 355 bilan almashtirildi. Esingizda bo'lsa kerak, Java-da satr qo'sh tirnoq ichiga o'raladi. Bu yaxshi, lekin muammo shundaki, satr manba faylning bir nechta satrini egallay olmaydi (Java qatori bilan chalkashmaslik uchun bu erda fayl qatorini "chiziq" deb ataymiz). Keling, aylanib o'taylik va masalan, \nagar tanaffus kerak bo'lsa, belgi yoki ko'p qatorli iboralarni birlashtirishdan foydalanamiz. Bu juda yaxshi chiqmaydi! O'rnatilgan HTML, XML, SQL yoki JSON fragmentlari bo'lgan matn harflari ayniqsa og'ir. Bularning barchasi qochish, birlashtirish va qo'lda tahrirlash kodni yozishni noqulay va o'qishni qiyinlashtiradi. Matn bloklari bu muammoni hal qilishga harakat qiladi. Ular uch qo'sh tirnoq bilan boshlanadi va ular bilan tugaydi (bilaman, bu unchalik yaxshi emas). Qo'shtirnoq orasidagi hamma narsa qatorning bir qismi, shu jumladan yangi qatorlar sifatida talqin qilinadi. Matn bloklari standart matn harflari bilan bir xil ishlatilishi mumkin va Java kodni xuddi shu tarzda kompilyatsiya qiladi. Ochilish qo'shtirnoqlaridan keyin qator ajratuvchi qo'yilishi kerak; matn bloklarini bir qatorda ishlatish mumkin emas, shuning uchun kod
String smallBlock = """Only one line""";
quyidagi xatolarga olib keladi:
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                          ^
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                                   	^
Oddiy HTML fragmenti endi shunday yozilishi mumkin:
String htmlBlock = """
               	<html>
                 	<body>
                   	<p>CodeGym Web page</p>
                 	</body>
               	<html>
         	     """;
Keling, matn bloklaridan foydalanishda xabardor bo'lish yaxshiroq bo'lgan bir nechta nozikliklarni eslatib o'tamiz. Yakunlovchi tirnoqlarning joylashuvi muhim bo'lib chiqadi: u vaqti-vaqti bilan oq bo'shliqqa qanday ishlov berilishini aniqlaydi. Yuqoridagi misolda yopilish qo'shtirnoqlari HTML matnining chekinishi bilan tekislangan. Bunday holda, kompilyator bo'shliqlarni olib tashlaydi va natijada biz quyidagi qatorni olamiz:
<html>
  <body>
    <p>My web page</p>
  </body>
</html>
Eslatma:bunday satr qator oxirida yangi qatorni o'z ichiga oladi. Agar kerak bo'lmasa, """ yopilish tirnoqlari to'g'ridan-to'g'ri </html> tegidan keyin qo'yilishi mumkin. Agar biz yopilish tirnoqlarini chap chetiga yaqinlashtirsak, bu olib tashlangan chekinish miqdorini o'zgartiradi. Agar biz ularni chapga ikkita bo'sh joy o'tkazsak, har bir qatorga ikkita bo'sh joy qo'shamiz. Chap chekkaga o'tish barcha to'ldirishni saqlab qolishiga olib keladi. Qo'shtirnoqlarni o'ngga siljitish hech qanday ta'sir qilmaydi va boshqa chekinish qo'shmaydi. Matn bloklari JDK 13 ga oldindan ko'rish xususiyati sifatida kiritilgan. Bu ular hali tegishli Java tili spetsifikatsiyasiga kiritilmaganligini anglatadi. Ya'ni, bu xususiyat tilning doimiy qismiga aylanadimi yoki bu erda faqat mehmonmi, aniq emas. Hozirda ishlab chiquvchilar ushbu xususiyatni sinab ko'rishlari va u haqida o'z fikrlarini bildirishlari mumkin. Matn bloklarining taqdiri bunga bog'liq bo'ladi: xususiyatni yaxshilash mumkin va agar sizga yoqmasa, uni butunlay olib tashlash mumkin. Agar siz matn bloklarini amalda sinab ko'rmoqchi bo'lsangiz, kompilyatsiya qilish va ishga tushirish uchun oldindan ko'rish xususiyatlari aniq kiritilishi kerakligini unutmang. Jamlama:

javac --enable-preview --release 13 TextBlock.java
Ilovani ishga tushirish uchun oldindan ko'rish xususiyatlarini yoqishingiz kerak:

java --enable-preview TextBlock
Sinfda Stringushbu til o'zgarishini to'ldiradigan uchta yangi usul mavjud:
  • formatted(): Format satri sifatida satrning o'zidan foydalanib, satrni formatlang. Qiyinchilikka tengformat(this, args)
  • stripIndent(): Satrdan tasodifiy bo'shliqlarni olib tashlaydi. Agar siz ko'p qatorli satrlarni o'qiyotgan bo'lsangiz va aniq deklaratsiya bilan bir xil bo'shliqni istisno qilishni qo'llamoqchi bo'lsangiz foydali bo'ladi.
  • translateEscapes()\ r: Tegishli Unicode qiymatiga tarjima qilingan qochish ketma-ketliklari (masalan, ) bilan satrni qaytaradi .
Qizig'i shundaki, bu usullar endigina paydo bo'lgan, lekin allaqachon eskirgan deb belgilangan ... bu holat JDK ning kelajakdagi versiyasida olib tashlanishi mumkinligini ko'rsatadi. Yangi usul qo'shish va darhol undan voz kechish biroz eksantrik ko'rinadi. Biroq, ushbu usullar o'zgartirilishi yoki olib tashlanishi mumkin bo'lgan oldindan ko'rish xususiyati bilan bog'liqligini unutmang. Ehtimol, izohni kiritish @PreviewFeaturebunday vaziyatlarda yordam berishi mumkin, lekin u hali JDKga kiritilmagan (garchi u JDK 14 da paydo bo'lishi ehtimoli yuqori).

JEP 354 : Ifodani almashtirish (oldindan ko'rish)

Java 12 o'zgartirish bayonoti bilan ifodalarni yozishning yangi shakli - JEP 325 taklifini taqdim etdi . Bu birinchi ko'rish xususiyati bo'lib chiqdi va uning taqdiri foydalanuvchilarga takliflar yuborish ajoyib g'oya ekanligini isbotlaydi. JDK 12 dan oldin switchu faqat harakatni bajaradigan, lekin natijani qaytarmaydigan bayonot sifatida ishlatilishi mumkin edi. switchAmmo Java 12 da uni o'zgaruvchiga tayinlanishi mumkin bo'lgan natijani qaytaruvchi ifoda sifatida ishlatishga ruxsat berdi . ichida case iboralari sintaksisida boshqa o'zgarishlar bo'ldi switch. Bu qanday ishlashini tushunish uchun JEP misolini ko'rib chiqaylik.
int numberOfLetters;
switch(dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
    numberOfLetter = 6;
    break;
  case TUESDAY
    numberOfLetter = 7;
    break;
  case THURSDAY
  case SATURDAY
    numberOfLetter = 8;
    break;
  case WEDNESDAY
    numberOfLetter = 9;
    break;
  default:
   throw new IllegalStateException("Huh?: " + day);
}
Ushbu misolda biz dayOfWeekqiymatni belgilash uchun qiymatdan foydalanamiz numberOfLetters. Operator ishining o'ziga xos xususiyatlaridan kelib chiqqan holda switch, bu kod eng chiroyli emas va xato qilish oson. Birinchidan, agar biz har bir ish yorlig'i guruhiga bayonot qo'llashni unutsak break, keyingi ish yorliqlari guruhiga sukut bo'yicha o'tamiz. Bu topish qiyin bo'lgan xatolarga olib kelishi mumkin. Ikkinchidan, har bir ish belgilari guruhini aniqlashimiz kerak. Agar unutib qo'ysak, albatta, biz kompilyator xatosiga duch kelamiz, ammo bu variant ideal emas. Bizning kodimiz ham juda batafsil, chunki har bir qiymat dayOfWeeko'z ish yorlig'iga ega bo'lishi kerak. Yangi sintaksisdan foydalanib, biz ancha toza va kamroq xatoga yo'l qo'yadigan kodga ega bo'lamiz:
int numberOfLetters = switch (dayOfWeek) {
   case MONDAY, FRIDAY, SUNDAY -> 6;
   case TUESDAY -> 7;
   case THURSDAY, SATURDAY -> 8;
   case WEDNESDAY -> 9;
   default -> throw new IllegalStateException("Huh?: " + day);
};
Endi biz topshiriqni faqat bir marta bajarishimiz kerak (iboraning qaytish qiymatidan switch) va katta-kichik belgilar uchun vergul bilan ajratilgan ro'yxatni ishlatishimiz mumkin. Va biz operatordan foydalanmayotganimiz sababli break, biz u bilan bog'liq muammolarni bartaraf qilamiz. Ifoda sintaksisi switchbizga eski uslub sintaksisidan foydalanishga imkon beradi, shuning uchun JDK 12 da biz buni quyidagicha yozishimiz mumkin:
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   break 6;
  case TUESDAY
   break 7;
  case THURSDAY
  case SATURDAY
   break 8;
  case WEDNESDAY
   break 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Java hamjamiyatiga ko'ra, breakqaytarish qiymatini belgilash uchun ortiqcha yuklanishdan foydalanish chalkash bo'lishi mumkin. Java tili, shuningdek , shartsiz o'tish operatori kabi yorliq bilan break(va ) dan foydalanishga imkon beradi . JEP 354 ushbu foydalanishni o'zgartirdi , shuning uchun Java 13 da bizning kodimiz biroz o'zgaradi: continuegotobreak
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   yield 6;
  case TUESDAY
   yield 7;
  case THURSDAY
  case SATURDAY
   yield 8;
  case WEDNESDAY
   yield 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Keyingi uchta JEP Java virtual mashinasi bilan bog'langan.

JEP 350 Dynamic CDS arxivi

Ushbu kengaytma Java dasturining bajarilishi oxirida sinflarni dinamik ravishda arxivlash imkonini beradi. class data sharingCDS yoki Class Data Sharing sukut bo'yicha xuddi shu sinflar ro'yxatidan foydalangan holda ishga tushirilganda ishga tushirilgan barcha sinflarni maxsus arxivga to'plash imkonini beradi . Bu ilovalarni ishga tushirish va RAMni tejashning sezilarli tezlashishiga olib keladi. Ilgari, AppCDS-dan foydalanish ko'p bosqichli jarayon bo'lib, tegishli sinflar ro'yxatini yaratish va ushbu ro'yxatni keyingi ishga tushirish uchun ishlatiladigan arxiv yaratish uchun ishlatishni o'z ichiga oladi. ArchiveClassesAtExitEndi talab qilinadigan narsa -XX: arxiv yoziladigan joyni ko'rsatuvchi bayroqli dasturni bir marta ishga tushirish . Ushbu yondashuv bilan, dastur odatdagi tarzda to'xtatilgandan so'ng, sinflar avtomatik ravishda arxivga joylashtiriladi.

JEP 351 ZGC : foydalanilmagan xotirani o'chirish

Bir yil oldin JDK 11 eksperimental, kengaytiriladigan, past kechikishli axlat yig'uvchi ZGC ni taqdim etdi. Dastlab, ZGC o'zini juda g'alati tutdi: u endi kerak bo'lmasa ham, xotirani operatsion tizimga qaytarishga ruxsat bermadi. Resurslar bir vaqtning o'zida bir nechta xizmatlar tomonidan ishlatiladigan konteynerlar kabi ba'zi muhitlar uchun bu tizimning kengayishi va samaradorligini cheklashi mumkin. ZGC to'plami ZPages deb ataladiganlardan iborat. Axlat yig'ish davrida ZPages tozalanganda, ular ZPageCache-ga qaytariladi. Ushbu keshdagi ZP-sahifalar qanchalik yaqinda ishlatilganiga qarab tartiblangan. Java 13 da ZGC uzoq vaqt davomida foydalanilmayotganligi aniqlangan sahifalarni operatsion tizimga qaytaradi. Shu tarzda ular boshqa jarayonlar uchun qayta ishlatilishi mumkin.

JEP 353 Eski Socket API-ni qayta ishga tushiring

Ikkala API ilovasi java.net.Sockethali java.net.ServerSocketham JDK 1.0. Bu va keyingi barcha JDK-larda ushbu API-larni amalga oshirish ularni moslashuvchan bo'lmagan va saqlashni qiyinlashtiradigan bir nechta usullardan (masalan, kirish/chiqarish buferi sifatida iplar to'plamidan foydalanish) foydalanadi. Ushbu muammoni hal qilish uchun JDK 13 da yangi dastur taqdim etildi NioSocketImpl. U endi mahalliy kodni talab qilmaydi, bu esa turli platformalarga portlashni osonlashtiradi. java.util.concurrentBu sinf, shuningdek , sinxronlashtirilgan usullardan ko'ra mavjud bufer kesh mexanizmidan (shu maqsadda iplar to'plamidan foydalanishni oldini olish) va qulflashdan foydalanadi . Bu Project Loom'dan tolalar bilan integratsiyani soddalashtiradi .

Yangi API'lar

Yuqorida aytib o'tganimizdek, Java 13 asosiy sinf kutubxonalarida 76 ta yangi APIni o'z ichiga oladi. Ular quyidagi sohalarni qamrab oladi:
  • Unicode qo'llab-quvvatlash yangilanishlari.
  • Matn bloklarini qo'llab-quvvatlashning uchta yangi usuli String(yuqoridagi JEP 255 tavsifiga qarang).
  • Sinflar java.nioendi mutlaq (nisbiydan farqli o'laroq) getva usullarini belgilang. Ular, asosiy abstrakt sinf kabi , buferning bir qismini olish Bufferusulini o'z ichiga oladi . slice()
  • force()Sinf usuli MappedByteBufferbufer qismini uning zaxira xotirasiga yozishga majbur qiladi.
  • nio.FileSystemnewFileSystem()fayl tizimi sifatida fayl tarkibiga kirish uchun uchta yangi haddan tashqari yuklangan shakllarni qo'shadi .
  • Yangi qiziqarli usul paydo bo'ldi javax.annotation.processing.ProcessingEnvironment. isPreviewEnabled(). Bu sizga oldindan ko'rish funksiyalari yoqilganligini bildiradi. Bu qiziq, chunki yuqorida aytib o'tilgan izoh @PreviewFeatureJDK 14 chiqarilmaguncha mavjud bo'lmaydi.
  • DocumentBuilderFactoryva nomlar maydonidan xabardor misollarni yaratish uchun uchta yangi usulni SAXParserFactoryoling .javax.xml.parsers
Material Saymon Ritterning maqolasi va rasmiy hujjatlarga asoslangan .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION