پس از شش ماه توسعه، اوراکل پلت فرم Java SE 23 (جاوا پلتفرم، نسخه استاندارد 23) را منتشر کرد که از پروژه منبع باز OpenJDK به عنوان پیاده سازی مرجع استفاده می کند. به استثنای حذف برخی از ویژگیهای منسوخ، Java SE 23 سازگاری با نسخههای قبلی پلتفرم جاوا را حفظ میکند - اکثر پروژههای جاوا که قبلاً نوشته شدهاند، هنگام اجرا تحت نسخه جدید بدون تغییر کار میکنند. بیلدهای آماده نصب جاوا SE 22 (JDK، JRE و سرور JRE) برای لینوکس (x86_64، AArch64)، ویندوز (x86_64) و macOS (x86_64، AArch64) آماده شده اند. پیاده سازی مرجع جاوا 23 که توسط پروژه OpenJDK توسعه یافته است، کاملاً منبع باز تحت مجوز GPLv2 است، با استثناهای GNU ClassPath که امکان پیوند پویا با محصولات تجاری را فراهم می کند.
Java SE 23 به عنوان نسخه پشتیبانی معمولی طبقه بندی می شود و تا نسخه بعدی به دریافت به روز رسانی ها ادامه خواهد داد. شاخه پشتیبانی طولانی مدت (LTS) باید Java SE 21 یا Java SE 17 باشد که به ترتیب تا سال 2031 و 2029 به روز رسانی ها را دریافت خواهند کرد (به طور کلی تا سال 2028 و 2026 در دسترس هستند). پشتیبانی گسترده از شاخه LTS جاوا SE 8 تا سال 2030 و جاوا SE 11 تا سال 2032 ادامه خواهد داشت.
در میان 23 نوآوری پیشنهادی در Java SE:
- حالت مولد کار زباله جمع کن ZGC (Generation Z Garbage Collector) به طور پیش فرض با استفاده از پردازش جداگانه اشیاء "قدیمی" و "جوان" فعال می شود که کارایی تمیز کردن اشیاء اخیرا ایجاد شده را با طول عمر کوتاه افزایش می دهد. استفاده از Generational ZGC خطر توقف در هنگام تخصیص منابع را کاهش می دهد، بار CPU و مصرف حافظه را در هنگام جمع آوری زباله کاهش می دهد. آزمایش ZGC نسلی با آپاچی کاساندرا 4 افزایش 4 برابری در توان با اندازه پشته ثابت و یک چهارم کاهش در اندازه پشته با توان عملیاتی ثابت را نشان داد.
- JavaDoc پشتیبانی برای استفاده از Markdown برای مستند کردن کد در نظرات اضافه کرده است که می تواند به جای ترکیبی از تگ های HTML و JavaDoc @ استفاده شود.

- مکانیسمهای تطبیق الگو با پشتیبانی اولیه برای استفاده از انواع اولیه (int، بایت، char، و سایر انواع پایه غیر شی) در انواع الگوها، در دستور "instanceof" و در بلوکهای "switch" بهبود یافتهاند. switch (x.getStatus()) { case 0 -> "OK"; مورد 1 -> "هشدار"؛ مورد 2 -> "خطا"؛ case int i -> "وضعیت ناشناخته: " + i; } if (i instance of byte b) { … b … }
- پشتیبانی اولیه برای استفاده از یک عبارت "واردات ماژول M" برای وارد کردن همه بسته های صادر شده توسط یک ماژول مشخص به طور همزمان اضافه شده است. این تغییر به طور قابل توجهی استفاده مجدد از کتابخانه های مدولار را ساده می کند و به شما امکان می دهد کتابخانه ها و کلاس ها را بدون تعیین مکان آنها در سلسله مراتب بسته ها اضافه کنید. به عنوان مثال، مشخص کردن "import module java.base" تمام 54 بسته موجود در ماژول java.base را وارد می کند، که قبلا باید به طور جداگانه ذکر می شد ("import java.io.*"، "import java.util.*" ” و غیره).
دومین پیاده سازی مقدماتی Class-File API برای تجزیه، تولید و تبدیل فایل های کلاس جاوا پیشنهاد شده است. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm &&mm.methodName().stringValue(). startsWith("debug"))) { classBuilder.with(ce);
- هشتمین پیشنمایش Vector API توابعی را برای محاسبات برداری ارائه میکند که با استفاده از دستورالعملهای برداری در پردازندههای x86_64 و AArch64 اجرا میشوند و اجازه میدهند عملیاتها بهطور همزمان روی مقادیر متعدد (SIMD) اعمال شوند. برخلاف قابلیت های ارائه شده در کامپایلر HotSpot JIT برای بردارسازی خودکار عملیات اسکالر، API جدید امکان کنترل صریح بردارسازی برای پردازش موازی داده را فراهم می کند.
- متدهای فرمت، printf، readPassword و readLine را به کلاس java.io.Console برای قالببندی، نمایش و خواندن متن بر اساس محلی انتخاب شده اضافه کرد. System.console().printf(Locale.FRANCE، "%1$tY-%1$tB-%1$te %1$tA"، new Date()) 2024-mai-16 jeudi
- اجرای پیشنمایش دوم از API جریان توسعهیافته اضافه شده است که از تعریف عملیات میانی شما پشتیبانی میکند، که ممکن است در مواردی که عملیات میانی داخلی موجود برای تبدیل دادههای مورد نظر کافی نیست، مفید باشد. کنترل کننده های بومی با استفاده از عملیات میانی جدید Stream::gather(Gatherer) متصل می شوند، که عناصر جریان را با اعمال یک کنترل کننده مشخص شده توسط کاربر برای آنها پردازش می کند. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4، 5، 6]، [7، 8، 9]]
- سومین پیادهسازی اولیه از کلاسهای اعلامشده ضمنی و نمونههای بینام متد «main» را اضافه کرد که میتواند از اعلانهای عمومی/ایستا، ارسال آرایهای از آرگومانها و سایر موجودیتهای مرتبط با اعلان کلاس صرفنظر کند. // کلاس عمومی بود HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // اکنون می توانید main() { System.out.println("Hello, World!"); }
- یک پیشنمایش دوم از ویژگی اضافه شد که به سازندهها اجازه میدهد تا عبارات را قبل از فراخوانی super(...) مشخص کنند، که برای فراخوانی صریح سازنده کلاس والد از سازنده کلاس ارثی استفاده میشود، اگر آن عبارات به نمونه ایجاد شده توسط سازنده اشاره نکنند. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } }
- سومین اجرای پیشنمایش مقادیر Scoped اضافه شده است که به دادههای تغییرناپذیر اجازه میدهد تا در رشتهها به اشتراک گذاشته شوند و دادهها به طور موثر بین رشتههای فرزند رد و بدل شوند (مقادیر به ارث میرسند). Scoped Values برای جایگزینی مکانیسم متغیرهای thread-local در حال توسعه هستند و هنگام استفاده از تعداد بسیار زیادی از رشته های مجازی (هزاران یا میلیون ها رشته) کارآمدتر هستند. تفاوت اصلی بین مقادیر Scoped و متغیرهای thread-local این است که اولی یک بار نوشته می شود، در آینده قابل تغییر نیست و فقط برای مدت اجرای thread در دسترس باقی می ماند.
- سومین پیشنمایش از Structured Concurrency API برای آزمایش پیشنهاد شده است، که توسعه برنامههای چند رشتهای را با پردازش چندین کار که در رشتههای مختلف بهعنوان یک بلوک واحد اجرا میشوند، ساده میکند.
- روش های دسترسی به حافظه خارجی (خارج از JVM) ارائه شده توسط کلاس sun.misc.Unsafe منسوخ شده و برای حذف برنامه ریزی شده است. برای دسترسی به حافظه خارج از هیپ و تعامل با کدهای خارجی، توصیه می شود از VarHandle API و FFM (Foreign Function & Memory) API استفاده کنید.
علاوه بر این، میتوان به انتشار یک بهروزرسانی برای پلتفرم برای ایجاد برنامههای کاربردی با رابط گرافیکی JavaFX 23 و گنجاندن کامپایلر GraalVM JIT در Oracle JDK 23 اشاره کرد.
همچنین نسخه جدیدی از ماشین مجازی جهانی GraalVM ارائه شده است که از برنامه های کاربردی در جاوا اسکریپت (Node.js)، پایتون، روبی، R، هر زبانی برای JVM (جاوا، اسکالا، Clojure، Kotlin) و زبان ها پشتیبانی می کند. که برای آن می توان بیت کد LLVM تولید کرد (C، C++، Rust). نسخه جدید علاوه بر پشتیبانی از JDK 23، مصرف حافظه و اندازه کدهای اجرایی را بهینه می کند و از ابزارهایی برای جاسازی Python و WebAssembly در کد جاوا با استفاده از کامپایل JIT پشتیبانی کامل می کند.
منبع: opennet.ru

