پارسا کاویان پور
پارسا کاویان پور
خواندن ۷ دقیقه·۳ سال پیش

ویژگی های معرفی شده در 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 رو مشخص میکنیم.

یکسری ویژگی های تخصصی تر هم اضافه شده که خوندنش رو به خودتون واگذار میکنم.. موفق باشید

منبع:

ویژگی های جدید جاوا





jdk17java17sealedclasssealedpatternmatching
شاید از این پست‌ها خوشتان بیاید