Optional.ofNullable पर Optional.of का उपयोग क्यों करें?


232

जावा 8 का उपयोग करते समय Optional वर्ग , दो तरीके हैं जिसमें एक मूल्य को वैकल्पिक में लपेटा जा सकता है।

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

मैं समझता हूं कि Optional.ofNullableउपयोग करने का एकमात्र सुरक्षित तरीका है Optional, लेकिन आखिर क्यों Optional.ofमौजूद है? Optional.ofNullable हर समय केवल सुरक्षित साइड पर ही क्यों और कैसे इस्तेमाल करें ?


1
कृपया मुझे बताएं कि इसका उपयोग करने के लिए कौन सा पैकेज आयात करना चाहिए?
LoveToCode

4
@LoveToCode java.util.Optional- यह उपलब्ध है यदि आप JDK 8 या बाद में उपयोग कर रहे हैं
whirlwin

11
मुझे अच्छा लगेगा अगर उन्होंने ofNullable()नाम लिया होगा of()और of()नाम दिया होगाofNotNull()
रॉबर्ट नेस्टिरोज


जैसा कि आप पूछ रहे हैं "Optional.of क्यों मौजूद है? क्यों न केवल Optional.ofNullable का उपयोग करें और हर समय सुरक्षित पक्ष पर रहें?" मान लीजिए कि यदि उपयोगकर्ता का आवश्यक डेटा मौजूद नहीं है, तो हमें अपवाद को फेंक देना चाहिए। तो, यह पूरी तरह से आपके usecase पर निर्भर करता है। baeldung.com/java-optional-throw-exception
करण अरोरा

जवाबों:


306

आपका प्रश्न इस धारणा पर आधारित है कि जो कोड फेंक सकता है वह उस कोड NullPointerExceptionसे भी बदतर है जो नहीं हो सकता है। यह धारणा गलत है। यदि आप उम्मीद करते हैं कि foobarप्रोग्राम लॉजिक के कारण आपका कभी अशक्त नहीं है, तो इसका उपयोग करना बेहतर है Optional.of(foobar)क्योंकि आप देखेंगे NullPointerExceptionकि जो इंगित करेगा कि आपके प्रोग्राम में बग है। यदि आप बग का उपयोग करते हैं Optional.ofNullable(foobar)और foobarऐसा होता है null, तो आपका कार्यक्रम चुपचाप गलत तरीके से काम करना जारी रखेगा, जो एक बड़ी आपदा हो सकती है। इस तरह एक त्रुटि बहुत बाद में हो सकती है और यह समझना बहुत कठिन होगा कि यह किस बिंदु पर गलत हुआ।


129
" यदि आप उम्मीद करते हैं कि कार्यक्रम के तर्क के कारण आपका फ़ॉबर कभी भी अशक्त नहीं है, तो इसका उपयोग करना बेहतर हैOptional.of(foobar) "। यह थोड़ा अजीब लगता है - जब हम जानते हैं कि मूल्य nullकिसी भी मामले में नहीं होगा , तो एक के भीतर लपेटने के बजाय स्वयं मूल्य का उपयोग क्यों न करें Optional?
कॉन्स्टेंटिन योवकोव

54
@kocko, आपको अपने Optionalद्वारा लागू किए जा रहे इंटरफ़ेस द्वारा आवश्यक विधि से लौटना पड़ सकता है (शायद अन्य कार्यान्वयनकर्ता खाली वैकल्पिक वापस कर सकते हैं)। या आप वैकल्पिक का एक संग्रह / स्ट्रीम बनाना चाहते हैं, जिनमें से कुछ गैर-शून्य की गारंटी है और कुछ नहीं हैं। या आपके पास सशर्त तर्क है जो कई शाखाओं में एक वैकल्पिक बनाता है और एकल शाखा में आपको यकीन है कि यह गैर-अशक्त है।
टैगिर वलेव

28
क्योंकि वैकल्पिक का मतलब है कि यह मौजूद हो सकता है, या अनुपस्थित हो सकता है। अनुपस्थित! = अशक्त। nullइस मामले में इसका मतलब है "मुझे उम्मीद है कि फोब्बर मौजूद होगा, लेकिन एक बग के कारण यह अशक्त है"। Optional.isPresent() == falseइसका मतलब है कि फोब्बर मौजूद नहीं है, यानी यह वैध व्यवहार है।
Buurman

43
@kocko: सरल उदाहरण: उम्मीद return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));की listजाती है कि इसमें कभी भी nullमूल्य नहीं होंगे ...
होल्गर

5
@ हर्ष अगर आप मुझसे पूछ रहे हैं, तो मैं हर जगह वैकल्पिक का उपयोग करने की सलाह नहीं देता। यह एक अलग सवाल है। आप यहां कुछ राय देख सकते हैं
टैगिर वलेव

12

इसके अलावा, यदि आप जानते हैं कि आपका कोड काम नहीं करना चाहिए यदि ऑब्जेक्ट अशक्त है, तो आप अपवाद का उपयोग करके फेंक सकते हैं Optional.orElseThrow

String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(NullPointerException::new);

1
लेकिन इसके लिए, आप भी कम उपयोग कर सकते हैंString name = Objects.requireNonNull(nullName);
होल्गर

1
अच्छा बिंदु @Holger, हालांकि .orElse () विधि कस्टम अपवादों को अनुमति देता है जो आपको नियंत्रण या लॉगिंग लॉगिंग के बेहतर प्रवाह में मदद कर सकते हैं।
निकोस स्टैस

1
अच्छी तरह से, आप अतिरिक्त जानकारी देने के लिए अपवाद के लिए एक संदेश की आपूर्ति कर सकते हैं। अनुकूलन का कोई अन्य प्रयास, जैसे कि एक अलग अपवाद का उपयोग करने से NullPointerExceptionजब समस्या स्पष्ट रूप से एक संदर्भ है जो कि ऐसा nullनहीं है, गलत दिशा में एक कदम होगा।
होल्गर

भी, आप वैकल्पिक उपयोग कर सकते हैं और अधिक विशिष्ट (जैसे कस्टम) अपवाद फेंकने के लिए, नहीं एनपीई, एनपीई बहुत सामान्य है, तो आप की तरह कुछ फेंक कर सकते हैंnew NullNameException("meaningful msg")
डेव

1

यह परिदृश्यों पर निर्भर करता है।

मान लीजिए कि आपके पास कुछ व्यावसायिक कार्यक्षमता है और आपको उस मूल्य के साथ कुछ और संसाधित करने की आवश्यकता है लेकिन nullप्रसंस्करण के समय मूल्य होने से यह प्रभावित होगा।

फिर, उस स्थिति में, आप उपयोग कर सकते हैं Optional<?>

String nullName = null;

String name = Optional.ofNullable(nullName)
                      .map(<doSomething>)
                      .orElse("Default value in case of null");

0

वैकल्पिक रूप से वैसे भी सेवाओं के परिणामों के लिए मुख्य रूप से उपयोग किया जाना चाहिए। सेवा में आप जानते हैं कि आपके पास क्या है और यदि आपके पास कोई परिणाम है तो Optional.of (someValue) लौटाएं और यदि आप नहीं करते हैं तो Optional.empty () लौटें। इस स्थिति में, कुछ मान कभी भी अशक्त नहीं होना चाहिए और फिर भी, आप एक वैकल्पिक लौटाते हैं।


1
सुमेश को संपादित करने के लिए धन्यवाद, लेकिन अंतिम पंक्ति में "someValue" जिसे आपने "कुछ मान" के रूप में संपादित किया है, ऊपर "Optional.of (someValue)" में चर का संदर्भ देता है और कुछValue रहना चाहिए, मुझे लगता है।
एस्पेन्डेनिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.