आपके द्वारा प्रस्तुत उदाहरण वैकल्पिक का उचित उपयोग नहीं है। एक खाली वैकल्पिक एक ऐसे मान का प्रतिनिधित्व करता है जो किसी कारण के लिए अनुपस्थित है जिसे कॉलर द्वारा भविष्यवाणी नहीं की जा सकती है। यह एक विधि के कानूनी आविष्कार का परिणाम है।
आपके द्वारा "पुराना मुहावरे" के रूप में मौजूद कोड इनपुट की मान्यता करता है और इनपुट अमान्य होने पर एक अनचेक अपवाद फेंकता है। यदि आप वैकल्पिक पेश करते हैं तो भी यह व्यवहार अपरिवर्तित रहना चाहिए। केवल अंतर यह होगा कि Object get(i)
का वापसी मूल्य संभवतः शून्य है जबकि Optional<?> get(i)
का वापसी मूल्य कभी शून्य नहीं होता है क्योंकि वैकल्पिक मान का एक विशेष राज्य मूल्य की अनुपस्थिति का प्रतिनिधित्व करता है।
विधियों का लाभ जो एक निरर्थक मूल्य के बजाय वैकल्पिक लौटाता है, बॉयलरप्लेट कोड का उन्मूलन है जो लौटाए गए मूल्य के साथ कुछ भी करने की कोशिश करने से पहले नियमित रूप से शून्य-जांच करना चाहिए। एक विधि के भीतर पूरी तरह से वैकल्पिक का उपयोग करने के कई और फायदे हैं। उदाहरण के लिए:
static Optional<Type> componentType(Type type) {
return Optional.of(type)
.filter(t -> t instanceof ParameterizedType)
.map(t -> (ParameterizedType) t)
.filter(t -> t.getActualTypeArguments().length == 1)
.filter(t -> Optional.of(t.getRawType())
.filter(rt -> rt instanceof Class)
.map(rt -> (Class<?>) rt)
.filter(Stream.class::isAssignableFrom)
.isPresent())
.map(t -> t.getActualTypeArguments()[0]);
यहाँ एक महत्वपूर्ण लाभ सही गुंजाइश नियंत्रण है: एक ही नाम t
एक प्रकार प्रसंस्करण के उस चरण के लिए उपयुक्त की एक चर के लिए प्रत्येक नए दायरे में पुन: उपयोग किया जाता है। इसलिए, उनके उपयोगी जीवन की समाप्ति के बाद दायरे में चर होने के लिए मजबूर होने के बजाय, और प्रत्येक निम्नलिखित चर के लिए एक नया नाम आविष्कार करने के लिए, इस मुहावरे के साथ हमारे पास सटीक न्यूनतम है जिसे हमें आगे बढ़ने की आवश्यकता है।
बस रुचि के लिए, आप equals
पूरी तरह से वैकल्पिक के मामले में लागू कर सकते हैं:
@Override public boolean equals(Object obj) {
return Optional.ofNullable(obj)
.filter(that -> that instanceof Test)
.map(that -> (Test)that)
.filter(that -> Objects.equals(this.s1, that.s1))
.filter(that -> Objects.equals(this.s2, that.s2))
.isPresent();
}
हालांकि मैं इस मुहावरे बहुत साफ है और पठनीय मिल जाए, यह वर्तमान में पर्याप्त अनुकूल नहीं है एक उत्पादन योग्य विकल्प के रूप में सिफारिश की जा करने के लिए । हालांकि जावा के भविष्य के संस्करण इस व्यवहार्य बना सकते हैं।
स्रोत
2015-03-01 17:03:32
मैं ज्यादातर मामलों में लगता है कि वैकल्पिक 'का स्थान ले लेगा वापसी अशक्त,' और एक अपवाद फेंक नहीं। लेकिन दोनों मामलों में यह निर्भर करता है। शून्य के बजाय वैकल्पिक उपयोग करने का विचार अनुपस्थिति को और अधिक स्पष्ट करने और नलपोइंटर अपवादों के जोखिम को कम करने के लिए है। – eckes