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