Optional ক্লাসটি Java 8 থেকে java.util প্যাকেজে অন্তর্ভুক্ত করা হয়েছে এবং এটি একটি container object যা null মান ধারণ করতে পারে বা কোনো মান ধারণ করতে পারে। মূল উদ্দেশ্য ছিল NullPointerException (NPE) প্রতিরোধ করা এবং কোডের পাঠযোগ্যতা ও নির্ভুলতা উন্নত করা।
Optional এর সাহায্যে, আপনি একটি মান অপসারণ করতে পারেন যেটি কখনও null হতে পারে এবং কোডের মধ্যে null চেকিং কমিয়ে ফেলতে পারেন। এটি একটি ভালো বিকল্প হিসেবে কাজ করে, বিশেষ করে সেই সমস্ত ক্ষেত্রে যেখানে null ভ্যালু এবং null চেকিং সমস্যা তৈরি করতে পারে।
Optional ক্লাসের বৈশিষ্ট্য এবং মেথডসমূহ
Optional ক্লাসটি java.util প্যাকেজে অন্তর্ভুক্ত এবং এটি null ভ্যালু পাস করার ঝুঁকি এড়াতে ব্যবহৃত হয়। এটি generic class এবং যেকোনো টাইপের ভ্যালু ধারণ করতে পারে। Optional ক্লাসের কিছু গুরুত্বপূর্ণ মেথড নিম্নরূপ:
1. isPresent():
- এটি চেক করে যে Optional অবজেক্টে কোনো মান আছে কিনা। যদি মান থাকে, এটি
trueরিটার্ন করবে, অন্যথায়falseরিটার্ন করবে।
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.isPresent()); // Output: true
2. get():
get()মেথডটি Optional থেকে মান বের করে। এটি শুধুমাত্র তখন ব্যবহার করা উচিত যখন আপনি নিশ্চিত যে মান রয়েছে, অন্যথায় এটি NoSuchElementException থ্রো করবে।
Optional<String> optional = Optional.of("Hello");
String value = optional.get();
System.out.println(value); // Output: Hello
3. orElse():
- এটি Optional এর ভিতরের মানটি ফেরত দেয় যদি তা উপস্থিত থাকে। কিন্তু যদি মান না থাকে (অর্থাৎ null), তবে আপনি একটি ডিফল্ট মান প্রদান করতে পারেন।
Optional<String> optional = Optional.empty();
String value = optional.orElse("Default Value");
System.out.println(value); // Output: Default Value
4. ifPresent():
- এটি একটি lambda expression গ্রহণ করে এবং যদি Optional-এ কোনো মান থাকে, তবে তা প্রক্রিয়া করা হয়। যদি মান না থাকে, তবে কিছুই হয় না।
Optional<String> optional = Optional.of("Hello");
optional.ifPresent(value -> System.out.println(value)); // Output: Hello
NullPointerException প্রতিরোধে Optional এর ব্যবহার
NullPointerException এর সমস্যা হলো যে যখন আপনি কোনো অবজেক্টের উপর মেথড কল করেন অথবা মান অ্যাক্সেস করেন, এবং তা null হয়, তখন এই এক্সসেপশনটি থ্রো হয়। Optional এই সমস্যাটিকে দূর করতে সহায়তা করে, কারণ এটি আপনাকে null চেক করতে বাধ্য করে এবং এভাবে NullPointerException প্রতিরোধ করে।
উদাহরণ ১: NullPointerException প্রতিরোধে Optional
public class OptionalExample {
public static void main(String[] args) {
String name = null;
// Traditional way of null check
if (name != null) {
System.out.println(name.length());
} else {
System.out.println("Name is null");
}
// Using Optional to avoid NullPointerException
Optional<String> optionalName = Optional.ofNullable(name);
System.out.println(optionalName.orElse("Default Name")); // Output: Default Name
}
}
Output:
Name is null
Default Name
ব্যাখ্যা:
- Traditional null check: সাধারণভাবে, null চেক করার জন্য
if (name != null)ব্যবহৃত হয়েছে। তবে, এটি অনেক জায়গায় ভুল হতে পারে এবং এর ফলে NullPointerException সৃষ্টি হতে পারে। - Using
Optional:Optional.ofNullable()ব্যবহার করে null মান এবং অন্য কোনো মানের জন্য Optional তৈরি করা হয়েছে। এখানেorElse()মেথডটি ব্যবহার করা হয়েছে যাতে null মানের জন্য একটি ডিফল্ট মান প্রদান করা হয়।
উদাহরণ ২: Optional ব্যবহার করে NullPointerException প্রতিরোধ
public class OptionalExample {
public static void main(String[] args) {
String name = null;
Optional<String> optionalName = Optional.ofNullable(name);
// Avoiding NPE using Optional
String result = optionalName.map(String::toUpperCase)
.orElse("Default Name");
System.out.println(result); // Output: Default Name
}
}
Output:
Default Name
ব্যাখ্যা:
map()মেথডটি Optional এর ভিতরের মানের উপর একটি ফাংশন প্রয়োগ করে। যদি মান null হয়, তাহলে এটি কোনো অপারেশন সম্পাদন করবে না।orElse()মেথডটি null থাকলে ডিফল্ট মান প্রদান করবে, যা NullPointerException প্রতিরোধ করে।
Optional এর সাথে Advanced ব্যবহার
1. filter():
filter()মেথডটি Optional এর মানটি একটি predicate দ্বারা ফিল্টার করে, যদি এটি শর্ত পূরণ করে তবে একটি নতুন Optional ফেরত দেয়, অন্যথায় এটি একটি খালি Optional ফেরত দেয়।
Optional<Integer> number = Optional.of(5);
Optional<Integer> filteredNumber = number.filter(n -> n > 10); // Empty Optional since 5 is not greater than 10
System.out.println(filteredNumber.isPresent()); // Output: false
2. flatMap():
flatMap()মেথডটি Optional এর মানের উপর আরো একটি Optional প্রয়োগ করে, এবং তা একটি সোজা Optional ফরম্যাটে ফেরত দেয়।
Optional<String> name = Optional.of("Java");
Optional<String> result = name.flatMap(n -> Optional.of(n.toUpperCase()));
System.out.println(result.get()); // Output: JAVA
3. orElseThrow():
orElseThrow()মেথডটি Optional এর ভিতরে মান না থাকলে exception থ্রো করে।
Optional<String> name = Optional.empty();
String result = name.orElseThrow(() -> new IllegalArgumentException("Name is required"));
Optional ক্লাসটি NullPointerException প্রতিরোধের জন্য একটি শক্তিশালী উপায়। এটি null ভ্যালুর ক্ষেত্রে পূর্বের মতো ক্ল্যাসিক null চেকিংকে এড়িয়ে যাওয়ার সুযোগ দেয় এবং কোডকে আরও ক্লিন এবং রিডেবল করে তোলে। Optional ব্যবহারের মাধ্যমে, আপনি নিশ্চিত হতে পারেন যে আপনার কোড null ভ্যালু থেকে সৃষ্ট ত্রুটির কারণে থামবে না, বরং আপনি ডিফল্ট মান অথবা উপযুক্ত এক্সসেপশন ম্যানেজমেন্টের মাধ্যমে সমস্যাটি সমাধান করবেন।
Optional ক্লাসের মাধ্যমে null চেকিং প্রক্রিয়াটি সহজ, পরিষ্কার এবং আরও নির্ভুল হতে পারে, যা ডেভেলপমেন্ট প্রক্রিয়ায় NullPointerException কমাতে সহায়ক হবে।
Read more