کیت توسعه جاوا ۲۲ دارای میانگین تعداد ویژگی های جدید است، اما از جهات دیگر بهتر از میانگین است. بیا یک نگاهی بیندازیم.
با نظم ساعت اتمی، آخرین نسخه جاوا، JDK 22، هفته گذشته منتشر شد. اگرچه این نسخه پشتیبانی بلندمدت (LTS) نیست، اما هیچ چیزی مانع از استفاده شما از آن در تولید نمیشود و دارای ویژگیهای جدید جالبی است.
بیایید به داخل شیرجه بزنیم و ببینیم این چه چیزی برای ما به ارمغان می آورد.
ویژگیهای جدید برای پلتفرم جاوا از طریق پیشنهادهای بهبود JDK (JEP) تعریف شدهاند، و JDK 22 شامل ۱۲ مورد از این موارد است. به طور تصادفی، در ۱۳ نسخه اخیر جاوا، از زمان تغییر به آهنگ شش ماهه، میانگین تعداد JEP (به نزدیکترین عدد صحیح) نیز ۱۲ است. بنابراین، می توانید این را به عنوان یک نسخه متوسط توصیف کنید!
با تفکیک بیشتر، ما چهار ویژگی نهایی و هشت ویژگی پیشنمایش یا ماژولهای انکوباتور داریم.
تغییر زبان جاوا
JEP 447: بیانیههای قبل از super( )
[پیش نمایش]. جاوا به عنوان یک زبان شی گرا، توانایی گسترش کلاس (غیر نهایی) دیگر و ارث بردن حالت و رفتار (در صورت مجاز) را فراهم می کند. برای اینکه این کار قابل اطمینان باشد، سازنده کلاس ها باید از بالا به پایین فراخوانی شوند تا از تداخل سازنده های زیر کلاس با سوپرکلاس ها جلوگیری شود. هنگامی که یک توسعه دهنده تصمیم می گیرد یک فراخوانی صریح با سازنده سوپرکلاس برقرار کند، این باید اولین عبارت باشد.
این برخی محدودیتها را تحمیل میکند که میتواند منجر به کد پیچیدهتر از حد مطلوب شود. بارزترین آنها ناتوانی در انجام آزمایش بر روی پارامترهای سازنده قبل از فراخوانی سازنده سوپرکلاس است. اگر یک آزمایش منجر به ایجاد یک استثنا شود، فراخوانی سازنده superclass از نظر فنی به یک سربار غیر ضروری تبدیل میشود.
JEP 447 راه کنترل شده ای را برای اجازه دادن به دستورات قبل از فراخوانی به super()
معرفی می کند. هر ارجاعی به ارجاعات this
یا super
باعث ایجاد خطا می شود زیرا شیء مورد ارجاع به طور کامل مقدار دهی اولیه نشده بود. چندین محدودیت دیگر به تفصیل در این JEP شرح داده شده است.
JEP 456: الگوها و متغیرهای بدون نام. قوی> که به عنوان یک ویژگی پیش نمایش در JDK 21 معرفی شده است، اکنون بدون هیچ تغییری نهایی شده است.
این ویژگی به توسعه دهندگان اجازه می دهد تا از یک زیرخط _
برای نشان دادن متغیری استفاده کنند که استفاده نمی شود. به جای نامگذاری متغیرهایی که کد ما را به هم می ریزند و دیدن آنچه در جریان است را سخت تر می کنند، می توانیم نحو درستی را برای یک ساختار حفظ کنیم و به خوانایی کمک کنیم.
یک مثال ساده یک حلقه سبک foreach
است که روی یک مجموعه تکرار می شود اما از مقدار بازیابی شده استفاده نمی کند:
for (String name : userList) userCount++;
این را می توان به صورت زیر ساده کرد:
for (String _ : userList) userCount++;
این یک مثال نسبتاً بیاهمیت است، اما وقتی روی الگوها اعمال شود، ارزش آن واضحتر میشود. با استفاده از الگوهای ضبط ترکیب شده، که نوعی الگوی ساختارشکنی هستند، ممکن است چیزی شبیه به این داشته باشیم:
public void printTopLeftX(Rectangle r) { if (r instanceof ColourRectangle(ColourPoint( Point(double x, double y), Colour c), ColourPoint bottomRight)) System.out.println(x); }
از آنجایی که همه ما از مقدار x استفاده می کنیم، همه متغیرهای دیگر (از جمله تعریف نوع آنها) اضافی هستند و کد را بسیار متراکم می کنند. با استفاده از الگوهای بدون نام، میتوانیم آن را به صورت زیر بنویسیم:
public void printTopLeftX(Rectangle r) { if (r instanceof ColourRectangle(ColourPoint(Point(var x, _), _), _) ) System.out.println(x); }
اینها همچنین می توانند در تطبیق الگو برای عبارات سوئیچ و لامبدا استفاده شوند.
JEP 459: الگوهای رشته (پیش نمایش).< /strong> که به عنوان یک ویژگی پیشنمایش در JDK 21 معرفی شده است، این ویژگی همچنان در پیشنمایش است و هیچ تغییری قابل مشاهده توسط توسعهدهندگان نیست.
ساخت رشتهها در جاوا میتواند به روشهای مختلف انجام شود: از طریق الحاق رشتهها و استفاده از کلاسهای کتابخانه مانند StringBuilder
و String.format()
. قالبهای رشتهای یک روش ساده برای بیان رشتههایی ارائه میکنند که حاوی مقادیری هستند که در زمان اجرا محاسبه میشوند.
ما اکنون یک پردازشگر الگوی رشته ای داریم، STR
، که می تواند درون یابی رشته ای را انجام دهد.
به عنوان یک مثال ساده، میتوانیم مقادیر را وارد کنیم:
String name = "Simon"; String info = STR." My name is \{name}";
قدرت واقعی الگوهای رشته ای این است که می توانید درون یابی بسیار پیچیده تری را انجام دهید، به عنوان مثال، با استفاده از فراخوانی متد:
String s = STR." We are here \{ // Method call DateTimeFormatter .ofPattern("B") .format(LocalTime.now()) } learning Java";
توجه داشته باشید که میتوانیم کد را همانطور که میخواهیم بدون تأثیر روی رشته تولید شده تورفتگی کنیم و حتی نظرات را نیز اضافه کنیم.
JEP 463: کلاسها و نمونههای به طور ضمنی اعلام شده main
[پیشنمایش]. این به عنوان یک ویژگی پیشنمایش در JDK 21 معرفی شد و با تغییرات قابل توجهی به همین ترتیب ادامه مییابد.
برای نوشتن حتی سادهترین برنامه جاوا به مراسم زیادی (یا کد دیگ بخار) نیاز است. برای “سلام جهان” مرسوم، به همه اینها نیاز داریم:
public class Hello { public static void main(String[] args) { System.out.println(“Hello, World!”); } }
JEP 463 به یک برنامه اجازه می دهد تا از یک روش نمونه main
استفاده کند، که نیازی به علامت گذاری به عنوان static
یا public
ندارد. همچنین یک واحد کامپایل را فراهم می کند به طوری که دیگر نیازی به تعریف صریح کلاس نداریم. اثر کلی این تغییرات کاهش برنامه ما به موارد زیر است:
void main(){ System.out.printIn("Hello, World!"); }
این برای توسعه دهندگان باتجربه کاربرد محدودی خواهد داشت اما به کسانی که با جاوا شروع می کنند کمک خواهد کرد.
تغییرات کتابخانه
JEP 454: API عملکرد خارجی و حافظه.< /strong> در ابتدا به عنوان یک ویژگی پیش نمایش در JDK 19 معرفی شد، اکنون یک ویژگی نهایی است.
این API بخشی از پروژه پاناما است و جایگزین سادهتری برای رابط بومی جاوا (JNI) میکند. این APIها راههای استانداردی را برای تعامل با حافظه بومی و کتابخانههای خارجی ارائه میکنند که بهجای کدهای بایت، مستقیماً در کدهای بومی کامپایل میشوند. تعامل دو جهته از طریق تماس های پایین (از جاوا به توابع بومی) و تماس های بالا (بازخوانی از کد بومی به کد جاوا) امکان پذیر است.
یک ابزار اضافی، jextract
، می تواند برای تولید کد برای دسترسی به یک کتابخانه خارجی استفاده شود. این به طور پیش فرض در JDK گنجانده نشده است، اما به عنوان کد منبع از OpenJDK در دسترس است.
JEP 457: Class-file API [پیشنمایش] . برای اکثر توسعه دهندگان، این یک API جالب نخواهد بود. پردازش فایلهای کلاس کاری است که JVM باید انجام دهد (برای بارگیری و اجرای برنامهها) و همچنین مورد نیاز بسیاری از چارچوبها و کتابخانهها است.
هدف این API استانداردسازی و سادهسازی نحوه تعامل کاربران با فایلهای کلاس است.
JEP 460: Vector API [پیش نمایش].< /strong> این API رکورد طولانیترین ویژگی پیشنمایش را دارد که در هفتمین تکرار آن در JDK 22 قرار دارد.
بردارها، در این مورد، به رجیسترهای بسیار گسترده ای که در همه CPUهای مدرن موجود است اشاره می کنند. با استفاده از تکنیکی به نام دستورالعمل منفرد، داده های متعدد (SIMD)، چندین عنصر از یک آرایه را می توان در بردار بارگذاری کرد و همان عملیات (مانند جمع یا تفریق یک مقدار) را می توان در یک چرخه ساعت انجام داد. این پردازش موازی می تواند منجر به بهبود عملکرد قابل توجهی برای عملیات عددی فشرده شود.
API راههایی را برای توسعهدهنده فراهم میکند تا نحوه ذخیره مقادیر در بردارها و عملیاتهای مورد نیاز بر روی آنها را مشخص کند.
برای موقعیتهای ساده، کامپایلر داخلی JVM بهموقع (JIT) مکانهایی را که میتوان از عملیات برداری استفاده کرد تشخیص داده و آنها را بهطور خودکار اعمال میکند. برای موقعیتهای پیچیدهتر، برای مثال، جایی که یک حلقه شامل یک آزمایش شرطی برای محاسبه است، این API مفید خواهد بود.
در روش دیگر، Azul Platform Prime Zing JVM از یک کامپایلر جایگزین JIT به نام Falcon استفاده می کند. بر اساس پروژه LLVM منبع باز، این میتواند موقعیتهای بیشتری را شناسایی کند که در آنها میتوان از عملیات برداری استفاده کرد و عملکرد بهتری را بدون اصلاح کد ارائه کرد.
JEP 461: گردآورندگان جریان [پیش نمایش].< /strong> streams API در JDK 8 معرفی شد و با ترکیب عبارات لامبدا، سبک کاربردی تری از برنامه نویسی را ارائه داد که قبلاً در جاوا امکان پذیر نبود.
جریانها از منبعی تشکیل شدهاند که عناصری را فراهم میکند که میتوانند قبل از ایجاد نتیجه یا عارضه جانبی با استفاده از عملیات پایانی، از صفر یا چند عملیات میانی عبور داده شوند.
برای عملیات ترمینال، این امکان وجود دارد که عملکرد خود را از طریق Stream::collector
تعریف کنید. اگرچه مجموعه ای غنی از عملیات میانی وجود دارد، اما اینها ثابت هستند و توسط یک توسعه دهنده قابل تمدید نیستند.
API جمعآوری جریان اکنون راهی برای تعریف یک عملیات میانی جدید ارائه میکند.
یک جمع کننده با چهار تابع تعریف می شود: یک اولیه ساز اختیاری، یک ادغام کننده، یک ترکیب کننده اختیاری و یک پایان دهنده اختیاری. با استفاده از اینها، توسعه دهندگان انعطاف کاملی در مورد نحوه پردازش عناصر ورودی جمع کننده و خروجی تولید شده برای ارسال به عملیات میانی یا پایانی بعدی دارند.
JEP 462: همزمانی ساختاریافته [پیش نمایش].< /strong> این اولین بار در JDK 19 به عنوان یک ماژول انکوباتور معرفی شد و از JDK 21 یک ویژگی پیش نمایش بوده است. هیچ تغییری در این نسخه ایجاد نشده است.
طبق ماهیت خود، نوشتن کد چند رشته ای قابل اعتماد چالش برانگیز است. در طول تاریخ جاوا، ما ویژگیهای جدید زیادی داشتهایم که این کار را حداقل تا حدودی سادهتر میکنند. ابزارهای همزمان، چارچوب فورک-جوین، و جریان های موازی همگی راه حل هایی را برای انواع مختلف موقعیت های چند رشته ای ارائه کرده اند.
همزمانی ساختاریافته، بخشی از Project Loom، چندین کار در حال اجرا در رشته های مختلف را به عنوان یک واحد کار در نظر می گیرد. این امر رسیدگی به خطا و لغو را آسانتر میکند.
JEP 464: مقادیر محدوده [پیش نمایش].< /strong> این به عنوان یک ویژگی پیش نمایش در JDK 21 معرفی شد و در JDK 22 بدون تغییر ادامه می یابد.
مقادیر محدوده نیز به Project Loom مرتبط هستند و جایگزینی برای متغیرهای thread-local ارائه میدهند. تفاوت اساسی این است که، به عنوان یک مقدار به جای یک متغیر، آنها تغییر ناپذیر هستند.
متغیرهای Thread-local پیچیدگی بیشتری نسبت به آنچه معمولاً مورد نیاز است دارند و هزینه منابع قابل توجهی در ارتباط با آنها دارند. با رشتههای مجازی که به ترتیب مقیاسپذیری بزرگتر از رشتههای پلتفرم اجازه میدهند، این هزینه منبع میتواند به یک عامل محدودکننده تبدیل شود. مقادیر محدوده این مشکل را به گونهای حل میکنند که به توسعهدهندگان امکان انعطافپذیری لازم برای منطق برنامه چند رشتهای را میدهد.
JVM و تغییرات دیگر
JEP 423: پین کردن منطقه برای G1. قوی> این بهبودی در نحوه عملکرد جمعآورنده زباله G1 (GC) است که تأخیر را هنگام استفاده از JNI کاهش میدهد.
برخلاف کد جاوا، تعاملات JNI ممکن است از اشاره گرهای صریح به اشیاء در پشته استفاده کند. زمانی که یک رشته جاوا در حال اجرای یک منطقه بحرانی از کد JNI است، جابجایی آن اشیا در پشته امکان پذیر نیست. برای جلوگیری از این مشکل، G1 GC را در مناطق بحرانی غیرفعال میکند که میتواند منجر به افزایش تأخیر شود، زیرا سایر رشتههای غیرJNI در صورت راهاندازی GC مسدود میشوند.
این تغییر به G1 GC اجازه میدهد حتی زمانی که یک رشته در یک منطقه بحرانی قرار دارد، با پین کردن مناطق حافظه استفادهشده توسط کد JNI، اما امکان جابجایی و جمعآوری دیگران را فراهم میکند.
JEP 458: راهاندازی کد منبع چند فایلی برنامه ها.در JDK 11، JEP 330 قابلیت اجرای یک فایل منبع واحد را بدون نیاز به کامپایل مستقیم آن را معرفی کرد. همانطور که در JEP 463 در بالا توضیح داده شد، این به سادهسازی شروع کار با جاوا مربوط میشود.
JEP 458 راهانداز برنامه java
را با فعال کردن برنامهای که بهعنوان چندین فایل از کد منبع جاوا ارائه میشود، به جای یک فایل، بهبود میبخشد. بیشتر توسعه دهندگان از IDE برای توسعه پروژه و jshell
برای آزمایش قطعه کد استفاده می کنند.
این ویژگی برای کسانی که به تازگی سفر خود را برای یادگیری برنامه نویسی در جاوا آغاز کرده اند بسیار مفید خواهد بود.
بالاتر از میانگین
همانطور که میبینید، JDK 22 دارای میانگین تعداد ویژگیهای جدید است، اما در ارائه آن ویژگیها از حد متوسط بهتر است. Azul بارگیری های رایگانی از ساخت های زولو OpenJDK Community Edition دارد که می توانید آنها را نصب و آزمایش کنید. چرا آن را امتحان نمی کنید؟
سایمون ریتر معاون CTO و قهرمان جاوا در Azul است.
—
انجمن فناوری جدید مکانی را برای رهبران فناوری – از جمله فروشندگان و سایر مشارکتکنندگان خارجی – فراهم میکند تا فناوری سازمانی نوظهور را در عمق و وسعت بیسابقه بررسی و بحث کنند. انتخاب ذهنی است، بر اساس انتخاب ما از فناوری هایی که معتقدیم مهم هستند و برای خوانندگان InfoWorld بیشترین علاقه را دارند. InfoWorld وثیقه بازاریابی را برای انتشار نمی پذیرد و حق ویرایش تمام محتوای ارائه شده را برای خود محفوظ می دارد. همه پرس و جوها را به doug_dineley@foundryco.com.
پست های مرتبط
JDK 22: نسخه متوسط جاوا، به نوعی
JDK 22: نسخه متوسط جاوا، به نوعی
JDK 22: نسخه متوسط جاوا، به نوعی