2017-10-02 15 views
5

जावा 9 requireNonNullElse और requireNonNullElseGet विधियों को Objects कक्षा में पेश करता है। क्या ये कार्यात्मक रूप से Optional.ofNullable()orElse() और orElseGet() विधियों के लिए अलग हैं?ऑब्जेक्ट्सरेक्वायर नॉननुलईएलएसई() और वैकल्पिक .ofNullable()। OrElse() के बीच क्या अंतर है?

String foo = null; 
Objects.requireNonNullElse(foo, "nonNull");//returns the string "nonNull" 
Optional.ofNullable(foo).orElse("nonNull");//also returns the string "nonNull" 

वे कोई कार्यात्मक अंतर है, तो क्यों Objects एक अब जोड़ दिया गया?

उत्तर

5

उनके व्यवहार में एक मामूली अंतर है। Objects.requireNonNullElse() की आवश्यकता है कि पैरामीटर में से एक गैर-शून्य हो, अन्यथा NullPointerException फेंक दिया गया है।

String foo = null, bar = null; 
Optional.ofNullable(foo).orElse(bar);//returns a null value 
Objects.requireNonNullElse(foo, bar);//throws a NullPointerException 
+3

वहाँ भी मामूली गैर कार्यात्मक अंतर यह है कि 'Optional' संस्करण कचरा उत्पन्न करता है * (जब तक कि जेआईटी उस स्मार्ट को अनुकूलित करने के लिए पर्याप्त स्मार्ट न हो) *। – Andreas

+3

@ एंड्रियास जेएमएच रिपोर्ट्स 'वैकल्पिक .ofNullable()। OrElse() 'और' ऑब्जेक्ट्स। रिक्वेयर नॉननुलईएलएसई() ' – ZhekaKozlov

+0

@ZhekaKozlov केवल' foo'' null' के बीच कोई आवंटन अंतर नहीं है, इस मामले में 'अनुपलब्ध() 'स्थिर * खाली * उदाहरण देता है। क्या आपने जेएमएच को गैर-शून्य 'foo' के साथ प्रयोग किया था? क्योंकि मैंने यह सवाल पूछकर पूछा कि * किसी * मूल्य के लिए दोनों के बीच कार्यात्मक अंतर क्या है, न केवल 'शून्य' मान। – Andreas

3

एक दूसरे को चुनने के बीच वैचारिक अंतर उनके दस्तावेज़ीकरण में समझाया गया है। यह एक एपीआई उपभोक्ता के दृष्टिकोण पर निर्भर करता है कि उनमें से कौन सा प्रभावी ढंग से उपयोग किया जाना चाहिए।

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 के संचालन के लिए स्थिर उपयोगिता तरीकों के होते हैंऑब्जेक्ट्स, या किसी ऑपरेशन से पहले कुछ स्थितियों की जांच करना।

ये सुविधाएं शामिल अशक्त-सुरक्षित या नल सहिष्णु तरीकों के लिए एक वस्तु का हैश कोड कंप्यूटिंग, एक वस्तु के लिए एक स्ट्रिंग लौटने, दो वस्तुओं की तुलना, और सूचियों को या उप-सीमा अगर जाँच मूल्य सीमा से बाहर हैं।

  • requireNonNullElse

    रिटर्न पहला तर्क अगर यह गैर-शून्य है और नहीं तो दूसरा तर्क अगर यह गैर-शून्य है

इसलिए व्यवहार में अंतर:

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

संबंधित मुद्दे