मैंने कई वेब साइटों पर पढ़ा है वैकल्पिक का उपयोग केवल रिटर्न प्रकार के रूप में किया जाना चाहिए, और विधि तर्कों में उपयोग नहीं किया जाना चाहिए। मैं तार्किक कारण खोजने के लिए संघर्ष कर रहा हूं। उदाहरण के लिए मेरे पास तर्क का एक टुकड़ा है जिसमें 2 वैकल्पिक पैरामीटर हैं। इसलिए मुझे लगता है कि इस तरह से मेरी विधि हस्ताक्षर लिखने के लिए समझ में आएगा (समाधान 1):
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
कई वेब पेज निर्दिष्ट करते हैं कि वैकल्पिक का उपयोग विधि तर्कों के रूप में नहीं किया जाना चाहिए। इसे ध्यान में रखते हुए, मैं निम्नलिखित विधि हस्ताक्षर का उपयोग कर सकता हूं और यह स्पष्ट करने के लिए एक स्पष्ट Javadoc टिप्पणी जोड़ सकता हूं कि तर्क अशक्त हो सकते हैं, उम्मीद है कि भविष्य के रखरखावकर्ता Javadoc पढ़ेंगे और इसलिए हमेशा तर्कों का उपयोग करने से पहले शून्य जांच करें (समाधान 2) :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
वैकल्पिक रूप से मैं अपने तरीके को चार सार्वजनिक तरीकों से बदल सकता हूं ताकि एक अच्छा इंटरफ़ेस प्रदान किया जा सके और इसे अधिक स्पष्ट किया जा सके p1 और P2 वैकल्पिक हैं (समाधान 3):
public int calculateSomething() {
calculateSomething(null, null);
}
public int calculateSomething(String p1) {
calculateSomething(p1, null);
}
public int calculateSomething(BigDecimal p2) {
calculateSomething(null, p2);
}
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
अब मैं कक्षा का कोड लिखने का प्रयास करता हूं जो प्रत्येक दृष्टिकोण के लिए तर्क के इस टुकड़े को आमंत्रित करता है। मैं पहली बार दो इनपुट पैरामीटर्स को किसी अन्य ऑब्जेक्ट से पुनः प्राप्त करता Optional
हूं, जो एस रिटर्न करता है और फिर, मैं आह्वान करता हूं calculateSomething
। इसलिए, यदि समाधान 1 का उपयोग किया जाता है तो कॉलिंग कोड इस तरह दिखाई देगा:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
यदि समाधान 2 का उपयोग किया जाता है, तो कॉलिंग कोड इस तरह दिखाई देगा:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));
यदि समाधान 3 लागू होता है, तो मैं ऊपर दिए गए कोड का उपयोग कर सकता हूं या मैं निम्नलिखित का उपयोग कर सकता हूं (लेकिन यह काफी अधिक कोड है):
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result;
if (p1.isPresent()) {
if (p2.isPresent()) {
result = myObject.calculateSomething(p1, p2);
} else {
result = myObject.calculateSomething(p1);
}
} else {
if (p2.isPresent()) {
result = myObject.calculateSomething(p2);
} else {
result = myObject.calculateSomething();
}
}
तो मेरा सवाल यह है Optional
कि पद्धति तर्कों के रूप में s का उपयोग करना बुरा क्यों माना जाता है (देखें समाधान 1)? यह मेरे लिए सबसे पठनीय समाधान की तरह दिखता है और यह सबसे स्पष्ट करता है कि पैरामीटर भविष्य के रखरखाव के लिए खाली / अशक्त हो सकते हैं। (मुझे पता है कि Optional
इसका उद्देश्य केवल एक वापसी प्रकार के रूप में इस्तेमाल किया जाना है, लेकिन मुझे इस परिदृश्य में इसका उपयोग नहीं करने के लिए कोई तार्किक कारण नहीं मिल सकता है)।
null
?