2015-12-18 6 views
5

ग्रूवी में, अगर मेरे पास है:डिफ़ॉल्ट ग्रूवी विधि पैरामीटर मान लागू करने जब अशक्त गुजर

def say(msg = 'Hello', name = 'world') { 
    "$msg $name!" 
} 

और फिर कहते हैं:

say() // Hello world! 
say("hi") // Hi world! 
say(null) // null world! 

पिछले एक सचमुच के रूप में null और आवेदन नहीं व्याख्या हो रही है क्यों है डिफ़ॉल्ट मान? क्या यह डिफ़ॉल्ट विधि तर्क मानों के उद्देश्य को पराजित नहीं करता है? मुझे लगता है कि null गुजरने से कुछ भी w/r/t तर्क लंबाई गुजरने से अलग है। अगर मैं items(null) फोन लेकिन ठीक से काम करता है, तो मैं सिर्फ items() कहना

def items(Set<String> items = []) { 
    new HashSet<>(items) 
} 

यह एक NullPointerException फेंक देगा:

मेरे यहाँ समस्या यह है कि अगर मैं अब एक विधि है कि एक तर्क के रूप में एक संग्रह लेता है। इसे सही काम करने के लिए, मुझे लाइन को new HashSet<>(items ?: []) होने के लिए बदलना है, जो फिर से, डिफ़ॉल्ट विधि तर्क मान रखने के पूरे उद्देश्य को हराने के लिए प्रतीत होता है।

मुझे यहां क्या याद आ रही है?

उत्तर

6

ग्रोवी में, डिफ़ॉल्ट पैरामीटर ओवरलोडेड विधियों को उत्पन्न करता है। इस प्रकार, इस:

def items(Set<String> items = []) { 
    new HashSet<>(items) 
} 

इन दोनों तरीकों तैयार करेगा (मैं javap इस्तेमाल किया इन मूल्यों को प्राप्त करने के लिए):

public java.lang.Object items(java.util.Set<java.lang.String>); 
public java.lang.Object items(); 

तो जब आप फोन items(null) आप कर रहे हैं, वास्तव में, कुछ मूल्य गुजर, और items(Set) विधि का उपयोग किया जाएगा।

आप डिफ़ॉल्ट पैरामीटर के बारे में this question भी देख सकते हैं।

+0

यह कुल समझ में आता है। धन्यवाद और अन्य पोस्ट के लिंक के लिए धन्यवाद। तो एल्विस ऑपरेटर का उपयोग करने के लिए सही जवाब क्या है? – icfantv

+0

हाँ। मुझे लगता है कि एल्विस अच्छा समाधान है। – Will

+1

@icfantv और यदि आप डुप्लिकेशंस को नापसंद करते हैं, तो डिफ़ॉल्ट पैरा और एल्विस + के रूप में शून्य का उपयोग करें जिसे आप hav.e करना चाहते हैं – cfrick

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