پس از شش ماه توسعه، اوراکل جاوا SE 17 (پلتفرم جاوا، نسخه استاندارد 17) را منتشر کرد که از پروژه منبع باز OpenJDK به عنوان پیاده سازی مرجع استفاده می کند. به استثنای حذف برخی از ویژگیهای منسوخ، Java SE 17 سازگاری با نسخههای قبلی پلتفرم جاوا را حفظ میکند - اکثر پروژههای جاوا که قبلاً نوشته شدهاند، در صورت اجرا تحت نسخه جدید بدون تغییر کار میکنند. بیلدهای آماده برای نصب جاوا SE 17 (JDK، JRE و سرور JRE) برای لینوکس (x86_64، AArch64)، ویندوز (x86_64) و macOS (x86_64، AArch64) آماده شده اند. پیاده سازی مرجع جاوا 17 که توسط پروژه OpenJDK توسعه یافته است، کاملاً منبع باز تحت مجوز GPLv2 است، با استثناهای GNU ClassPath که امکان پیوند پویا با محصولات تجاری را فراهم می کند.
جاوا SE 17 به عنوان نسخه پشتیبانی طولانی مدت (LTS) طبقه بندی شده است که تا سال 2029 به دریافت به روز رسانی ادامه خواهد داد. بهروزرسانیهای نسخه اصلی جاوا 16 متوقف شده است. شاخه قبلی LTS جاوا 11 تا سال 2026 پشتیبانی می شود. نسخه بعدی LTS برای سپتامبر 2024 برنامه ریزی شده است. یادآوری می کنیم که با شروع انتشار جاوا 10، این پروژه به یک فرآیند توسعه جدید تبدیل شد که به معنای چرخه کوتاه تری برای شکل گیری نسخه های جدید است. عملکرد جدید اکنون در یک شاخه اصلی که دائماً بهروز میشود، توسعه مییابد که شامل تغییرات آماده است و شاخهها هر شش ماه یکبار برای تثبیت نسخههای جدید منشعب میشوند.
ویژگی های جدید جاوا 17 عبارتند از:
- یک پیادهسازی آزمایشی از تطبیق الگو در عبارات "سوئیچ" پیشنهاد شده است که امکان استفاده از مقادیر دقیق را در برچسبهای "مورد"، بلکه الگوهای منعطف که مجموعهای از مقادیر را به طور همزمان پوشش میدهند، را میدهد، که قبلاً لازم بود از دست و پا گیر استفاده شود. زنجیره ای از عبارات "اگر...دیگر". علاوه بر این، سوئیچ توانایی مدیریت مقادیر NULL را دارد. شی o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); پیش فرض -> o.toString(); };
- پشتیبانی تثبیت شده برای کلاسها و رابطهای مهر و موم شده، که نمیتوانند توسط کلاسها و رابطهای دیگر برای ارث بردن، گسترش یا لغو پیادهسازی استفاده شوند. کلاسهای مهر و موم شده نیز بر اساس فهرستبندی صریح زیر کلاسهای مجاز برای گسترش، روشی شفافتر برای محدود کردن استفاده از سوپرکلاس نسبت به اصلاحکنندههای دسترسی ارائه میکنند. بسته com.example.geometry; کلاس مهر و موم شده عمومی مجوزهای شکل com.example.polar.Circle، com.example.quad.Rectangle، com.example.quad.simple.Square {…}
- پیشنمایش دومی از Vector API پیشنهاد شده است که توابعی را برای محاسبات برداری ارائه میکند که با استفاده از دستورالعملهای برداری در پردازندههای x86_64 و AArch64 اجرا میشوند و اجازه میدهند تا عملیاتها به طور همزمان روی چندین مقدار (SIMD) اعمال شوند. برخلاف قابلیت های ارائه شده در کامپایلر HotSpot JIT برای بردارسازی خودکار عملیات اسکالر، API جدید امکان کنترل صریح بردارسازی برای پردازش موازی داده را فراهم می کند.
- پیش نمایشی از API عملکرد و حافظه خارجی اضافه شده است که به برنامه ها اجازه می دهد با کد و داده های خارج از زمان اجرا جاوا تعامل داشته باشند. API جدید به شما این امکان را میدهد تا به طور موثر توابع غیر JVM را فراخوانی کنید و به حافظههای غیر مدیریتشده JVM دسترسی داشته باشید. برای مثال، میتوانید توابع را از کتابخانههای مشترک خارجی فراخوانی کنید و بدون استفاده از JNI به دادههای فرآیند دسترسی داشته باشید.
- موتور رندر macOS که Java 2D API را تامین میکند، که به نوبه خود Swing API را تامین میکند، برای استفاده از API گرافیکی Metal سازگار شده است. پلتفرم macOS به طور پیشفرض به استفاده از OpenGL ادامه میدهد و فعال کردن پشتیبانی Metal نیاز به تنظیم «-Dsun.java2d.metal=true» و حداقل اجرای macOS 10.14.x دارد.
- یک پورت برای پلتفرم macOS/AArch64 (رایانههای اپل بر اساس تراشههای جدید Apple M1) اضافه شده است. ویژگی خاص پورت پشتیبانی از مکانیسم حفاظت حافظه W^X (Write XOR Execute) است که در آن نمی توان به طور همزمان به صفحات حافظه برای نوشتن و اجرا دسترسی داشت. (کد فقط پس از غیرفعال شدن نوشتن قابل اجرا است و نوشتن در صفحه حافظه فقط پس از غیرفعال شدن اجرا امکان پذیر است).
- برای عبارات ممیز شناور فقط به استفاده از معناشناسی strictfp بازگشته است. پشتیبانی از معناشناسی «پیشفرض» که از زمان انتشار جاوا 1.2 در دسترس بود، متوقف شده است، از جمله سادهسازی برای کار بر روی سیستمهایی با پردازندههای مشترک ریاضی x87 بسیار قدیمی (پس از ظهور دستورالعملهای SSE2، نیاز به معناشناسی اضافی ناپدید شد).
- انواع جدیدی از رابط ها برای مولد اعداد شبه تصادفی پیاده سازی شده اند و الگوریتم های اضافی برای تولید بهتر اعداد تصادفی پیاده سازی شده اند. به برنامه ها این فرصت داده می شود تا الگوریتمی برای تولید اعداد شبه تصادفی انتخاب کنند. پشتیبانی بهبود یافته برای تولید جریان های شی تصادفی.
- کپسولهسازی دقیق تمام اجزای داخلی JDK، به استثنای APIهای حیاتی مانند sun.misc.Unsafe. کپسولهسازی دقیق تلاشها را از کد برای دسترسی به کلاسها، متدها و فیلدهای داخلی مسدود میکند. قبلاً، حالت محصورسازی دقیق را میتوان با استفاده از گزینه "--inlegal-access=permit" غیرفعال کرد، اما اکنون این حالت منسوخ شده است. برنامههایی که نیاز به دسترسی به کلاسها، متدها و فیلدهای داخلی دارند باید با استفاده از گزینه --add-opens یا ویژگی Add-Opens در فایل مانیفست آنها را به صراحت تعریف کنند.
- به برنامهها این امکان داده میشود که فیلترهای سریالزدایی دادهها را تعریف کنند، که میتوانند به زمینه حساس باشند و به صورت پویا بر اساس عملیاتهای خاص deserialization انتخاب شوند. فیلترهای مشخص شده برای کل ماشین مجازی (در سراسر JVM) قابل اجرا هستند، یعنی. نه تنها خود برنامه، بلکه کتابخانه های شخص ثالث مورد استفاده در برنامه را نیز پوشش می دهد.
- Swing روش javax.swing.filechooser.FileSystemView.getSystemIcon را برای بارگذاری آیکون های بزرگ برای بهبود رابط کاربری در صفحه نمایش با DPI بالا اضافه کرده است.
- java.net.DatagramSocket API پشتیبانی از اتصال به گروه های Multicast را بدون نیاز به یک java.net.MulticastSocket API جداگانه فراهم می کند.
- ابزار IGV (Ideal Graph Visualizer) بهبود یافته است و تجسم تعاملی نمایش کد میانی را در کامپایلر HotSpot VM C2 JIT ارائه می دهد.
- در JavaDoc، بر اساس قیاس با کامپایلر javac، وقتی یک خطا خروجی میشود، شماره خط مشکلدار در فایل منبع و محل خطا نشان داده میشود.
- ویژگی native.encoding اضافه شد که منعکس کننده نام رمزگذاری کاراکتر سیستم (UTF-8، koi8-r، cp1251، و غیره) است.
- رابط java.time.InstantSource اضافه شده است که امکان دستکاری زمان را بدون ارجاع به منطقه زمانی فراهم می کند.
- API java.util.HexFormat برای تبدیل به نمایش هگزادسیمال و بالعکس اضافه شد.
- یک حالت سیاه چاله به کامپایلر اضافه شده است که عملیات حذف کد مرده را غیرفعال می کند، که می تواند هنگام انجام تست های عملکرد استفاده شود.
- گزینه "-Xlog:async" به Runtime اضافه شده است تا لاگ ها را در حالت ناهمزمان ضبط کند.
- هنگام ایجاد اتصالات ایمن، TLS 1.3 به طور پیش فرض فعال است (قبلاً از TLS 1.2 استفاده می شد).
- API اپلت منسوخ اعلام شده قبلی (java.applet.Applet*، javax.swing.JApplet)، که برای اجرای برنامه های جاوا در مرورگر استفاده می شد، به دسته بندی برنامه ریزی شده برای حذف (از دست رفتن ارتباط پس از پایان پشتیبانی) منتقل شده است. برای افزونه جاوا برای مرورگرها).
- Security Manager که مدتهاست ارتباط خود را از دست داده و پس از پایان پشتیبانی از افزونه مرورگر بی ادعا شده است، به دسته موارد برنامه ریزی شده برای حذف منتقل شده است.
- مکانیسم RMI Activation حذف شده است، که قدیمی است، به دسته یک گزینه در جاوا 8 تنزل داده شده است و تقریباً هرگز در عمل مدرن استفاده نمی شود.
- یک کامپایلر آزمایشی که از JIT (فقط به موقع) برای کامپایل پویا کد جاوا برای HotSpot JVM و همچنین حالت کامپایل پیش بینی شده (AOT، پیش از زمان) کلاس ها در کد ماشین قبل از راه اندازی ماشین مجازی پشتیبانی می کند. ، از SDK حذف شده است. کامپایلر به زبان جاوا و بر اساس کار پروژه Graal نوشته شده است. خاطرنشان می شود که تعمیر و نگهداری کامپایلر نیاز به کار زیادی دارد که در صورت عدم تقاضا از سوی توسعه دهندگان توجیه پذیر نیست.
منبع: opennet.ru