2011-09-15 14 views
25

संभव डुप्लिकेट:
Java optional parametersवैकल्पिक पैरामीटर के साथ जावा कन्स्ट्रक्टर/विधि?

मुझे पता है कि PHP में आप कम मापदंडों यदि आप यह घोषणा के साथ एक समारोह कॉल करना चाहते हैं, तो समारोह की तरह:

function foo(int param1, int param2 = "2"); 

और अब मैं foo(2) और param2 पर कॉल कर सकता हूं 2.

पर सेट किया जाएगा

मैंने जावा कन्स्ट्रक्टर में ऐसा करने की कोशिश की लेकिन ऐसा लगता है कि यह संभव नहीं है। क्या ऐसा करने का कोई तरीका है या मुझे सिर्फ दो रचनाकार घोषित करना है?

धन्यवाद!

+0

मैं PHP से परिचित नहीं हूं, लेकिन आप विधि के अंदर param2 क्यों घोषित नहीं करते? –

+2

यह बताता है कि यह एक वैकल्पिक पैरामीटर है, यदि आप param2 निर्दिष्ट करते हैं तो यह आपके द्वारा दिया जाने वाला मान प्राप्त करता है, अन्यथा यह मान "2" – luketorjussen

उत्तर

13

जावा डिफ़ॉल्ट पैरामीटर का समर्थन नहीं करता है। आप जो चाहते हैं उसे करने के लिए आपको दो रचनाकारों की आवश्यकता होगी।

डिफ़ॉल्ट विकल्प के साथ बहुत से संभावित मान हैं, तो विकल्प वैकल्पिक रूप से बिल्डर पैटर्न का उपयोग करना है, जिससे आप सेटर्स के साथ एक सहायक ऑब्जेक्ट का उपयोग करते हैं।

उदा।

public class Foo { 
    private final String param1; 
    private final String param2; 

    private Foo(Builder builder) { 
     this.param1 = builder.param1; 
     this.param2 = builder.param2; 
    } 
    public static class Builder { 
     private String param1 = "defaultForParam1"; 
     private String param2 = "defaultForParam2"; 

     public Builder param1(String param1) { 
     this.param1 = param1; 
     return this; 
     } 
     public Builder param2(String param1) { 
     this.param2 = param2; 
     return this; 
     } 
     public Foo build() { 
     return new Foo(this); 
     } 
    } 
    } 

जो आप कहने के लिए अनुमति देता है:

Foo myFoo = new Foo.Builder().param1("myvalue").build(); 

जो param2 लिए एक डिफ़ॉल्ट मान होगा।

+0

+1 प्राप्त करता है, लेकिन ... जहां * जावा * डिफ़ॉल्ट पैरामीटर का समर्थन करता है? ;-) –

+0

:-) काफी उचित है। संपादित करेंगे –

71

जावा में डिज़ाइनरों या विधियों में डिफ़ॉल्ट मानों के साथ वैकल्पिक पैरामीटर की अवधारणा नहीं है। आप मूल रूप से ओवरलोडिंग के साथ फंस गए हैं। हालांकि, आप आसानी से चेन कंस्ट्रक्टर को कोड दोहराने की जरूरत नहीं है:

public Foo(int param1, int param2) 
{ 
    this.param1 = param1; 
    this.param2 = param2; 
} 

public Foo(int param1) 
{ 
    this(param1, 2); 
} 
+0

यह एक स्वीकार्य उत्तर होना चाहिए! –

0

आप ऐसा क्यों करना चाहते हैं?

हालांकि, आप यह कर सकते हैं:

public void foo(int param1) 
{ 
    int param2 = 2; 
    // rest of code 
} 

या:

public void foo(int param1, int param2) 
{ 
    // rest of code 
} 

public void foo(int param1) 
{ 
    foo(param1, 2); 
} 
0

आप वैकल्पिक तर्क नहीं हो सकता है जावा में एक निश्चित मूल्य के लिए डिफ़ॉल्ट है। आप जिस चीज के बारे में बात कर रहे हैं उसके निकटतम चीज़ java varargs है जिससे आप एक विधि में मनमानी संख्या (उसी प्रकार के) को पारित कर सकते हैं।

6

आप इसे varargs का उपयोग करके अनुकरण कर सकते हैं, फिर भी आपको इसे बहुत से तर्कों के लिए जांचना चाहिए।

public void foo(int param1, int ... param2) 
{ 
    int param2_ 
    if(param2.length == 0) 
     param2_ = 2 
    else if(para2.length == 1) 
     param2_ = param2[0] 
    else 
     throw new TooManyArgumentsException(); // user provided too many arguments, 

    // rest of the code 
} 

हालांकि यह दृष्टिकोण ऐसा करने का एक अच्छा तरीका नहीं है, इसलिए ओवरलोडिंग का उपयोग करना बेहतर है।

2

आप वैकल्पिक पैरामीटर के लिए varargs उपयोग कर सकते हैं:

public class Booyah { 
    public static void main(String[] args) { 
     woohoo(1); 
     woohoo(2, 3); 
    } 
    static void woohoo(int required, Integer... optional) { 
     Integer lala; 
     if (optional.length == 1) { 
      lala = optional[0]; 
     } else { 
      lala = 2; 
     } 
     System.out.println(required + lala); 
    } 
} 

यह भी int से अधिक Integer के उपयोग ध्यान देना महत्वपूर्ण है। Integera wrapper around the primitive int है, जो आवश्यकतानुसार null के साथ तुलना करने की अनुमति देता है।

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