ویژگی های معرفی شده در JAVA 17

استفاده ی همیشگی از کلید واژه ی strictfpدر جاوا برای اطمینان از یکسان بودن نتایج محاسبات بر مقادیر اعشاری در پلتفرم های مختلف از کلید واژه ی strictfp استفاده میشد (درواقع ممکن است مثلا دقت اعداد اعشاری در پلتفرم های مختلف یکسان نباشد)در نسخه ی 17 جاوا نیاز به استفاده از این کلیدواژه نبوده زیرا بصورت پیشفرض اعمال میشودعلامت گذاری Applet برای حذف نهایی:همونطور که میدونید Applet ها خیلی وقته از دور خارج شدن و در Java 9 به صورت کامل منسوخ شدند ولی هنوز از Jdk حذف نشدند.در حال حاضر Applet علامت گذاری شده برای حذف شدن در نسخه های بعدی.در جاوا 9 :@Deprecated(since=9)public class Applet extends Panel{}در جاوا 17 :@Deprecated(since=9)@SuppressWarnings(&quotremoval&quot)public class Applet extends Panel{}Pattern matching for switch:جاوا خیلی وقته داره قول چنین حرکتی رو میده. اما بیاید ببینیم دقیقا چیه:یک متد رو در نظر بگیرید که داره یک شی از ورودی میگیره و توی یک قالب رشته ای نشونش میده.اول باید چک کنیم اون ابجکت(شی) از چه جنسیه و بصورت معمول همچین حرکتی میزنیم(استفاده از عملگر instance of):public static String formatter(Object o) { String formatted = &quotunknown&quot if (o instanceof Integer i) { formatted = String.format(&quotint %d&quot, i); } else if (o instanceof Long l) { formatted = String.format(&quotlong %d&quot, l); } else if (o instanceof Double d) { formatted = String.format(&quotdouble %f&quot, d); } else if (o instanceof String s) { formatted = String.format(&quotString %s&quot, s); } return formatted; }میبینیم که کد یکم طولانی و خرچنگ قورباغه ای شده: public static String formatterJava17(Object o) { return switch (o) { case Integer i -> String.format(&quotint %d&quot, i); case Long l -> String.format(&quotlong %d&quot, l); case Double d -> String.format(&quotdouble %f&quot, d); case String s -> String.format(&quotString %s&quot, s); default -> o.toString(); }; }اینم از معجزه ی جاوا 17 ! خیلی تر و تمیز تر.حالا بریم سراغ حرکت بعدی که به سوییچ اضافه شده. اگه یادتون باشه برای اینکه بخوایمnull بودن رو چک کنیم توی سوییچ امکانش نیست و باید از if استفاده کنیم: public static void main(String[] args) { testString(&quotJava 16&quot); // Ok testString(&quotJava 11&quot); // LTS testString(&quot&quot); // Ok testString(null); // Unknown! } static void testString(String s) { if (s == null) { System.out.println(&quotUnknown!&quot); return; } switch (s) { case &quotJava 11&quot, &quotJava 17&quot -> System.out.println(&quotLTS&quot); default -> System.out.println(&quotOk&quot); } }خب حالا دیگه میتونیم null بودن رو هم به این صورت در سوییچ چک کنیم: public static void main(String[] args) { testStringJava17(&quotJava 16&quot); // Ok testStringJava17(&quotJava 11&quot); // LTS testStringJava17(&quot&quot); // Ok testStringJava17(null); // Unknown! } static void testStringJava17(String s) { switch (s) { case null -> System.out.println(&quotUnknown!&quot); case &quotJava 11&quot, &quotJava 17&quot -> System.out.println(&quotLTS&quot); default -> System.out.println(&quotOk&quot); } }ویژگی جالب دیگه ای که به سوییچ اضافه شده شرط گذاشتن توی کیس هاستدر حالت معمول بازم باید از if condition استفاده میکردیم:class Shape {} class Rectangle extends Shape {} class Triangle extends Shape { int calculateArea(){ //... } } static void testTriangle(Shape s) { switch (s) { case null: break; case Triangle t: if (t.calculateArea() > 100) { System.out.println(&quotLarge triangle&quot); break; }else{ System.out.println(&quotTriangle&quot); } default: System.out.println(&quotUnknown!&quot); } }درواقع توی یک کیس یه if و یه else گذاشتیم برای حالت های مختلف برنامه ولی از الان دیگه نمیخواد اینکار رو هم انجام بدیم : static void testTriangle2(Shape s) { switch (s) { case null -> {} case Triangle t && (t.calculateArea() > 100) -> System.out.println(&quotLarge triangle&quot); case Triangle t -> System.out.println(&quotTriangle&quot); default -> System.out.println(&quotUnknown!&quot); } }خب معجزه ی سوییچ همینجا تموم میشه . امیدوارم خسته نشده باشید که میخوایم سراغ یه چیز خفن بریم که شی گرایی جاوا رو تکمیل تر میکنه:کلاس های مهر و موم شده (sealed class):در جاوا هنگام ارث بری نمیتونستیم مشخص کنیم که Parent ها کی باشن .. ولی الان دیگه میتونیم مشخص کنیم که دقیقا Child ها کیا میتونن باشن . شاید بپرسید خب این به چه دردی میخوره؟ سعی شی گرایی نزدیک کردن مفاهیم کد نویسی به دنیای واقعیه. فرض کنید یک کلاس وسیله ی نقلیه دارید . خب چه کلاسایی میتونن فرزند این باشن؟ واضحه که دو نوع وسیله ی نقلیه بیشتر نداریم.. موتوری و غیر موتوری .در واقع جاوا اصل رو بر توسعه ی مجدد گذاشته بود و با این فرض که ممکنه یه روزی یه وسیله ی نقلیه بیاد که نه موتوری باشه نه غیر موتوری(ولی با مفاهیم دنیای واقعی جور نیست).الان دیگه مشخصا اعلام میکنیم فقط دو تا کلاس موتوری و غیر موتوری میتونن از کلاس وسیله ی نقلیه ارث بری کنن.مثال دیگه خونه هست (فقط ویلایی و غیر ویلایی داریم)یه مثال ریز :public sealed interface Command permits LoginCommand, LogoutCommand, PluginCommand{ //...}با permits کلاس های child رو مشخص میکنیم.یکسری ویژگی های تخصصی تر هم اضافه شده که خوندنش رو به خودتون واگذار میکنم.. موفق باشید منبع:ویژگی های جدید جاوا