+2 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)

کلاس Optional در جاوا 8 اضافه شده است و گفته می شود ابزاری برای جلوگیری از برخورد با NullPointerException و چک کردن های اضافی متغییر های برای null نبودن است. مزیت اصلی نوع داده Optional چیست؟

1 پاسخ

+3 امتیاز
قبل توسط (365 امتیاز)
ویرایش شده قبل توسط
 
بهترین پاسخ

هر شیء Optional مانند یک ظرف است که یک شیء دیگر – که می‌تواند null باشد- در دل خود نگه می‌دارد. کتابخانه‌های جدید (بعد از جاوا 8)  مقدار خروجی برخی متدهایی که ممکن است null برگردانند را از نوع Optional تعیین می‌کنند.
مثلاً فرض کنید متد findPerson به شکل زير تعريف شده باشد:

public Person findPerson(String ssn) {...}

به این ترتیب، اگر متد findPerson به شکل زير استفاده شود، ممکن است منجر به NullPointerException شود (چون شاید findPerson مقدار null برگرداند)  :

System.out.println( findPerson ("65232").getAddress()  );

یک کتابخانه جدید، احتمالاً findPerson را به شکل زير تعريف می‌کند که به جای Person مقداری از نوع Optional<Person> برمی‌گرداند:

public Optional<Person> findPerson(String ssn) {...}

وقتی یک متد مقدار Optional برمی‌گرداند، یعنی کاربر این متد باید مواظب باشد چون خروجی این متد «ممکن است شامل null باشد». به عبارت دیگر نویسنده متد، با این کار تصريح می‌کند که شاید این متد خروجی نداشته باشد و استفاده‌کنندگان باید قبل از کاربرد آن، چک کنند که خروجی آن null نباشد.  مثلاً از طريق متد isPresent :

findPerson("65232").ifPresent(person->System.out.println(person.getAddress()));

یا حتی بهتر (اگر با امکانات جاوا 8 آشنا هستید)  :

findPerson("65232")
.map(Person::getAddress)
.ifPresent(System.out::println);

البته این امکان جدید (Optional) معجزه نمی‌کند! همچنان ممکن است NullPointerException به وجود آید. استفاده‌کنندگان Optional هم ممکن است از آن بهره‌برداری اشتباه کنند. مثلاً بدون این که چک کنند که درون یک Optional مقدار null هست یا خیر، از آن استفاده کنند (با کمک متد get که شیء داخلی آن را برمی‌گرداند) و بنویسند:

System.out.println(  findPerson("65232").get().getAddress()  );

ولی به هر حال Optional کمک می‌کند که برنامه‌نویس حواسش را جمع کند. اشتباه کمتر می‌شود و NullPointerException  هم کمتر رخ می‌دهد. کدهای تولیدشده هم تمیزتر و خواناتر و موجزتر می‌شوند.

قبل توسط (1.1هزار امتیاز)
تشکر از جواب کاملتون.

سوالات مشابه

0 امتیاز
1 پاسخ 381 بازدید
+2 امتیاز
1 پاسخ 545 بازدید
+1 امتیاز
1 پاسخ 597 بازدید
0 امتیاز
0 پاسخ 292 بازدید
0 امتیاز
1 پاسخ 556 بازدید
0 امتیاز
0 پاسخ 915 بازدید
0 امتیاز
0 پاسخ 684 بازدید
+1 امتیاز
1 پاسخ 619 بازدید
...