एक दूसरे को चुनने के बीच वैचारिक अंतर उनके दस्तावेज़ीकरण में समझाया गया है। यह एक एपीआई उपभोक्ता के दृष्टिकोण पर निर्भर करता है कि उनमें से कौन सा प्रभावी ढंग से उपयोग किया जाना चाहिए।
Optional
कंटेनर ऑब्जेक्ट है जिसमें गैर-शून्य मान हो सकता है या नहीं हो सकता है।
जिसका प्रकार Optional
कभी नहीं खुद null
होना चाहिए एक चर; यह हमेशा Optional
उदाहरण इंगित करना चाहिए।
यह एक मूल्य-आधारित वर्ग है; वैकल्पिक-संवेदनशील उदाहरणों पर पहचान-संवेदनशील संचालन (संदर्भ समानता (==), पहचान हैश कोड, या सिंक्रनाइज़ेशन समेत) अप्रत्याशित परिणाम हो सकते हैं और इससे बचा जाना चाहिए।
ofNullable
एक वर्तमान मूल्य यदि निर्धारित मूल्य में गैर-शून्य है के साथ एक Optional
देता है, अन्यथा एक खाली Optional
orElse
यदि अन्यथा मान देता है तो अन्य देता है।
इसलिए निम्नलिखित व्यवहार:
String foo = null;
=> Optional.ofNullable(foo).orElse("nonNull")
=> Optional.ofNullable(null).orElse("nonNull")
=> Optional.empty().orElse("nonNull")
=> return otherwise "nonNull"
एक ही रूप में यह पार करता
String foo = null, bar = null;
=> Optional.ofNullable(foo).orElse(bar);
=> Optional.ofNullable(null).orElse(bar);
=> Optional.empty().orElse(bar)
=> return otherwise 'bar'
=> returns null
Objects
एक वर्ग है पर 01 के संचालन के लिए स्थिर उपयोगिता तरीकों के होते हैंऑब्जेक्ट्स, या किसी ऑपरेशन से पहले कुछ स्थितियों की जांच करना।
ये सुविधाएं शामिल अशक्त-सुरक्षित या नल सहिष्णु तरीकों के लिए एक वस्तु का हैश कोड कंप्यूटिंग, एक वस्तु के लिए एक स्ट्रिंग लौटने, दो वस्तुओं की तुलना, और सूचियों को या उप-सीमा अगर जाँच मूल्य सीमा से बाहर हैं।
इसलिए व्यवहार में अंतर:
String foo = null;
=> Objects.requireNonNullElse(foo, "nonNull")
=> Objects.requireNonNullElse(null, "nonNull");
जो आगे आंतरिक रूप से अगर requireNonNull("nonNull", "defaultObj")
और फिर
=> returns "nonNull" since its a non-null value
अब
के रूप में यह पार करता मूल्यांकन करता
String foo = null, bar = null;
=> Objects.requireNonNullElse(foo, bar);
=> Objects.requireNonNullElse(null, bar);
यह आंतरिक रूप से जाँच करता है, तो requireNonNull(bar, "defaultObj")
जो तब
=> throws a NullPointerException
के रूप में अच्छी तरह से प्रलेखित के रूप में
throws NullPointerException
- दोनों obj null
और है अगर defaultObj null
वहाँ भी मामूली गैर कार्यात्मक अंतर यह है कि 'Optional' संस्करण कचरा उत्पन्न करता है * (जब तक कि जेआईटी उस स्मार्ट को अनुकूलित करने के लिए पर्याप्त स्मार्ट न हो) *। – Andreas
@ एंड्रियास जेएमएच रिपोर्ट्स 'वैकल्पिक .ofNullable()। OrElse() 'और' ऑब्जेक्ट्स। रिक्वेयर नॉननुलईएलएसई() ' – ZhekaKozlov
@ZhekaKozlov केवल' foo'' null' के बीच कोई आवंटन अंतर नहीं है, इस मामले में 'अनुपलब्ध() 'स्थिर * खाली * उदाहरण देता है। क्या आपने जेएमएच को गैर-शून्य 'foo' के साथ प्रयोग किया था? क्योंकि मैंने यह सवाल पूछकर पूछा कि * किसी * मूल्य के लिए दोनों के बीच कार्यात्मक अंतर क्या है, न केवल 'शून्य' मान। – Andreas