Java SE 22 platformasining chiqarilishi va OpenJDK 22 ochiq havolalarni amalga oshirish

Olti oylik rivojlanishdan so'ng Oracle Java SE 22 (Java Platformasi, Standard Edition 22) ni chiqardi, u OpenJDK ochiq manba loyihasini mos yozuvlar dasturi sifatida ishlatadi. Ba'zi eskirgan xususiyatlarni olib tashlash bundan mustasno, Java SE 22 Java platformasining oldingi versiyalari bilan orqaga qarab muvofiqlikni saqlab qoladi - ilgari yozilgan Java loyihalarining ko'pchiligi yangi versiyada ishlayotganda o'zgartirishlarsiz ishlaydi. Java SE 22 (JDK, JRE va Server JRE) ning oʻrnatiladigan tuzilmalari Linux (x86_64, AArch64), Windows (x86_64) va macOS (x86_64, AArch64) uchun tayyorlangan. OpenJDK loyihasi tomonidan ishlab chiqilgan Java 22 mos yozuvlar ilovasi GPLv2 litsenziyasi ostida to'liq ochiq, GNU ClassPath istisnolari bilan tijorat mahsulotlariga dinamik ulanish imkonini beradi.

Java SE 22 muntazam qoʻllab-quvvatlash versiyasi sifatida tasniflanadi va keyingi nashrga qadar yangilanishlarni olishda davom etadi. Uzoq muddatli qo'llab-quvvatlash (LTS) filiali Java SE 21 yoki Java SE 17 bo'lishi kerak, ular mos ravishda 2031 va 2029 yilgacha yangilanishlarni oladi (umuman 2028 va 2026 yilgacha mavjud). Java SE 11 ning LTS filialini davlat tomonidan qo‘llab-quvvatlash o‘tgan yilning sentyabr oyida yakunlangan, ammo kengaytirilgan qo‘llab-quvvatlash 2032 yilgacha davom etadi. Java SE 8 ning LTS filiali uchun kengaytirilgan yordam 2030 yilgacha davom etadi.

Eslatib o'tamiz, Java 10-ning chiqarilishidan boshlab, loyiha yangi ishlab chiqish jarayoniga o'tdi, bu yangi nashrlarni shakllantirish uchun qisqaroq tsiklni nazarda tutadi. Doimiy yangilanib turadigan bitta asosiy bo'limda yangi funksiyalar ishlab chiqilgan bo'lib, u tayyor o'zgarishlarni o'z ichiga oladi va yangi nashrlarni barqarorlashtirish uchun har olti oyda filiallar bo'linadi.

Java 22-dagi yangi xususiyatlar quyidagilarni o'z ichiga oladi:

  • G1 axlat yig'uvchisi mintaqani mahkamlashni qo'llab-quvvatlashni o'z ichiga oladi, bu sizga Java ob'ektlarining axlat yig'uvchi tomonidan ko'chirilishiga yo'l qo'ymaslik uchun xotiradagi joylashuvini vaqtincha tuzatishga va ushbu ob'ektlarga havolalarni Java va mahalliy kod o'rtasida xavfsiz o'tkazishga imkon beradi. Tugatish sizga JNI (Java Native Interface) ning muhim hududlarini mahalliy kod bilan bajarishda kechikishni kamaytirishga va axlat yig'ishni o'chirib qo'ymaslikka imkon beradi (ushbu bo'limlarni bajarayotganda, JVM poyga sharoitlarini oldini olish uchun ular bilan bog'langan muhim ob'ektlarni ko'chirmasligi kerak). Pinning muhim ob'ektlarni axlat yig'uvchisi ko'rinishidan olib tashlaydi, bu esa mahkamlanmagan joylarni tozalashda davom etishi mumkin.
  • Super(...) ga qo'ng'iroq qilishdan oldin konstruktorlarda ifodalarni ko'rsatishga ruxsat berish uchun dastlabki xususiyat qo'shildi, agar bu iboralar konstruktor tomonidan yaratilgan misolga tegishli bo'lmasa, meros qilib olingan sinf konstruktoridan ota-klass konstruktorini aniq chaqirish uchun foydalaniladi. class Outer { void salom() { System.out.println("Salom"); } class Inner { Inner() { salom(); super(); } } }
  • FFM (Foreign Function & Memory) API barqarorlashtirildi, bu JNI (Java Native Interface) dan foydalanmasdan tashqi kutubxonalardan funksiyalarni chaqirish va JVM dan tashqaridagi xotiraga kirish orqali Java dasturlarini tashqi kod va maʼlumotlar bilan oʻzaro taʼsir qilish imkonini beradi.
  • Nomsiz o'zgaruvchilarni qo'llab-quvvatlash va naqshlarni moslashtirish yoqilgan - qo'ng'iroq qilishda foydalanilmagan, ammo kerakli o'zgaruvchilar va naqshlar o'rniga endi "_" belgisini belgilashingiz mumkin. // was String pageName = switch (page) { case GitHubIssuePage(var url, var content, var links, int issueNumber) -> “ISSUE #” + issueNumber; ... }; // endi siz String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> “ISSUE #” + issueNumber; };
  • Java sinf fayllarini tahlil qilish, yaratish va konvertatsiya qilish uchun Class-File API ning dastlabki tatbiq etilishi taklif etiladi. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bayt); bayt[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);} } });
  • Java yordam dasturi bir nechta kod fayllari yoki oldindan kompilyatsiya qilingan sinf kutubxonalari ko'rinishida taqdim etilgan Java dasturlarini ushbu fayllarni alohida kompilyatsiya qilmasdan va qurish tizimini konfiguratsiya qilmasdan ishga tushirish imkoniyatini beradi. Yangi funksiya turli sinflar kodi alohida fayllarga ajratilgan dasturlarni ishga tushirishni osonlashtiradi. Prog.java: class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java: class Helper { static void run() { System.out.println("Salom!"); } }

    Masalan, ikkita "Prog.java" va "Helper.java" fayllaridan iborat dasturni ishga tushirish uchun endi "java Prog.java" ni ishga tushirish kifoya, u Prog sinfini kompilyatsiya qiladi, Helper sinfiga havolani belgilaydi, Helper faylini toping va kompilyatsiya qiling. java va asosiy usulni chaqiring.

  • String literallari va matn bloklariga qo'shimcha ravishda amalga oshirilgan String andozalarining ikkinchi dastlabki ilovasi qo'shildi. String shablonlari + operatoridan foydalanmasdan matnni hisoblangan ifodalar va o'zgaruvchilar bilan birlashtirish imkonini beradi. Ifodalarni almashtirish \{..} almashtirishlar yordamida amalga oshiriladi va almashtirilgan qiymatlarning to'g'riligini tekshirish uchun maxsus ishlov beruvchilar ulanishi mumkin. Masalan, SQL mexanizmi SQL kodiga almashtirilgan qiymatlarni tekshiradi va java.sql.Statement ob'ektini chiqish sifatida qaytaradi, JSON protsessori esa JSON almashtirishlarining to'g'riligini nazorat qiladi va JsonNode-ni qaytaradi. String query = "Tanlash * FROM Shaxs p WHERE p." + xususiyat + " = '" + qiymat + "'"; // was Statement query = SQL.""" SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // bo'ldi
  • X86_64 va AArch64 protsessorlarida vektor ko'rsatmalari yordamida bajariladigan va operatsiyalarni bir vaqtning o'zida bir nechta qiymatlarga (SIMD) qo'llash imkonini beruvchi vektorli hisoblar uchun funktsiyalarni ta'minlovchi Vektor API-ning ettinchi ko'rinishi qo'shildi. HotSpot JIT kompilyatorida skalar operatsiyalarni avtovektorlashtirish uchun taqdim etilgan imkoniyatlardan farqli o'laroq, yangi API parallel ravishda ma'lumotlarni qayta ishlash uchun vektorizatsiyani aniq nazorat qilish imkonini beradi.
  • O'zingizning oraliq operatsiyalaringizni aniqlashni qo'llab-quvvatlaydigan kengaytirilgan Stream API ning dastlabki ilovasi qo'shildi, bu mavjud o'rnatilgan oraliq operatsiyalar kerakli ma'lumotlarni o'zgartirish uchun etarli bo'lmagan hollarda foydali bo'lishi mumkin. Mahalliy ishlov beruvchilar oqim elementlarini foydalanuvchi tomonidan belgilangan ishlov beruvchini qo‘llash orqali qayta ishlovchi yangi Stream::gather(Gatherer) oraliq operatsiyasi yordamida ulanadi. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(yangi WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • Sinov uchun Structured Concurrency uchun eksperimental API ning ikkinchi versiyasi taklif qilindi, bu esa bir blok sifatida turli oqimlarda bajarilgan bir nechta vazifalarni qayta ishlash orqali ko'p tarmoqli ilovalarni ishlab chiqishni soddalashtiradi.
  • Ochiq/statik deklaratsiyalar, argumentlar massivi va sinf deklaratsiyasi bilan bog'liq bo'lgan boshqa ob'ektlardan voz kechishi mumkin bo'lgan "asosiy" usulning aniq e'lon qilingan sinflar va nomsiz namunalarining ikkinchi dastlabki amalga oshirilishi qo'shildi. // edi public class HelloWorld { public static void main(String[] args) { System.out.println("Salom dunyo!"); } } // endi siz main() ni bekor qilishingiz mumkin { System.out.println("Salom, Dunyo!"); }
  • Oʻzgarmas maʼlumotlarni tarmoqlar boʻylab almashish va maʼlumotlarning asosiy mavzular (qiymatlar meros qilib olinadi) oʻrtasida samarali almashish imkonini beruvchi “Scoped Values”ning ikkinchi oldindan koʻrish ilovasi qoʻshildi. Tarmoqli qiymatlar mahalliy o'zgaruvchilar mexanizmini almashtirish uchun ishlab chiqilmoqda va juda ko'p sonli virtual oqimlardan (minglab yoki millionlab iplar) foydalanganda samaraliroq bo'ladi. Scoped Values ​​va thread-local o'zgaruvchilar o'rtasidagi asosiy farq shundaki, birinchisi bir marta yoziladi, kelajakda o'zgartirilmaydi va faqat ipning bajarilishi davomida mavjud bo'lib qoladi.
  • Parallel axlat yig'uvchisi ob'ektlarning katta massivlari bilan ishlashda unumdorlikni oshirdi. Optimallashtirish ob'ektlarning katta massivlari bilan ba'zi sinovlarda ob'ektni qidirishni boshlashdan oldin kechikishni 20% ga kamaytirishga imkon berdi.

Bundan tashqari, JavaFX 22 grafik interfeysi bilan ilovalar yaratish uchun platforma yangilanishi e'lon qilinishini qayd etishingiz mumkin.

Manba: opennet.ru

a Izoh qo'shish