java - क्या जावा डिफ़ॉल्ट पैरामीटर मानों का समर्थन करता है?




methods parameters (13)

मैं कुछ जावा कोड में आया जिसमें निम्नलिखित संरचना थी:

public MyParameterizedFunction(String param1, int param2)
{
    this(param1, param2, false);
}

public MyParameterizedFunction(String param1, int param2, boolean param3)
{
    //use all three parameters here
}

मुझे पता है कि सी ++ में मैं पैरामीटर को एक डिफ़ॉल्ट मान असाइन कर सकता हूं। उदाहरण के लिए:

void MyParameterizedFunction(String param1, int param2, bool param3=false);

क्या जावा इस तरह के वाक्यविन्यास का समर्थन करता है? क्या कोई कारण हैं कि यह दो चरण वाक्यविन्यास बेहतर क्यों है?


आप यह स्कैला में कर सकते हैं, जो जेवीएम पर चलता है और जावा प्रोग्राम के साथ संगत है। http://www.scala-lang.org/

अर्थात

class Foo(var prime: Boolean = false, val rib: String)  {}

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

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

@GenerateMethodInvocationBuilder
public class CarService {
 public CarService() {
 }

 public String getCarsByFilter(//
   @Default("Color.BLUE") Color color, //
   @Default("new ProductionYear(2001)") ProductionYear productionYear,//
   @Default("Tomas") String owner//
 ) {
  return "Filtering... " + color + productionYear + owner;
 }
}

और फिर आप विधियों का आह्वान कर सकते हैं।

CarService instance = new CarService();
String carsByFilter = CarServiceGetCarsByFilterBuilder.getCarsByFilter()//
  .invoke(instance);

या किसी भी डिफ़ॉल्ट मान को किसी और चीज़ पर सेट करें।

CarService instance = new CarService();
String carsByFilter = CarServiceGetCarsByFilterBuilder.getCarsByFilter()//
  .withColor(Color.YELLOW)//
  .invoke(instance);

इस तरह मैंने यह किया ... यह आपके परिभाषित पैरामीटर के खिलाफ 'वैकल्पिक तर्क' के रूप में सुविधाजनक नहीं है, लेकिन यह काम पूरा हो जाता है:

public void postUserMessage(String s,boolean wipeClean)
{
    if(wipeClean)
    {
        userInformation.setText(s + "\n");
    }
    else
    {
        postUserMessage(s);
    }
}

public void postUserMessage(String s)
{
    userInformation.appendText(s + "\n");
}

नोटिस मैं एक ही विधि नाम को केवल एक स्ट्रिंग के साथ बुला सकता हूं या मैं इसे स्ट्रिंग और बुलियन वैल्यू के साथ बुला सकता हूं। इस मामले में, wipeClean को सही करने के लिए सेटिंग को मेरे टेक्स्ट एरिया में दिए गए स्ट्रिंग के साथ सभी टेक्स्ट को प्रतिस्थापित कर देगा। WipeClean को गलत पर सेट करना या इसे सभी को छोड़कर बस टेक्स्टएरिया को प्रदान किया गया टेक्स्ट जोड़ता है।

यह भी ध्यान दें कि मैं दो तरीकों से कोड दोहराना नहीं कर रहा हूं, मैं केवल अतिरिक्त बूलियन के साथ एक ही नाम के साथ एक नई विधि बनाकर टेक्स्टएरिया को रीसेट करने में सक्षम होने की कार्यक्षमता जोड़ रहा हूं।

मुझे वास्तव में लगता है कि यह एक छोटा क्लीनर है अगर जावा ने हमारे पैरामीटर के लिए 'वैकल्पिक तर्क' प्रदान किया है, इसलिए हमें डिफ़ॉल्ट मानों आदि के लिए कोड की आवश्यकता होगी। इस उदाहरण में, मुझे इसके बारे में चिंता करने की आवश्यकता नहीं है। हां, मैंने अपनी कक्षा में अभी तक एक और तरीका जोड़ा है, लेकिन मेरी विनम्र राय में लंबे समय तक पढ़ना आसान है।


इस समाधान का प्रयास करें:

public int getScore(int score, Integer... bonus)
{
    if(bonus.length > 0)
    {
        return score + bonus[0];
    }

    return score;
}

जैसा कि स्काला का उल्लेख किया गया था, Kotlin भी उल्लेखनीय है। कोटलिन फ़ंक्शन पैरामीटर में डिफ़ॉल्ट मान भी हो सकते हैं और वे अन्य पैरामीटर को भी देख सकते हैं:

fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size) {
    ...
}

स्कैला की तरह, कोटलिन जेवीएम पर चलता है और आसानी से मौजूदा जावा परियोजनाओं में एकीकृत किया जा सकता है।


दुख की बात है नहीं।


नहीं, आपको मिली संरचना यह है कि जावा इसे कैसे संभालता है (यानी, डिफ़ॉल्ट पैरामीटर के बजाय ओवरलोडिंग के साथ)।

रचनाकारों के लिए, प्रभावशाली जावा देखें: प्रोग्रामिंग भाषा मार्गदर्शिका का आइटम 1 टिप (कन्स्ट्रक्टर के बजाए स्थैतिक फैक्ट्री विधियों पर विचार करें) यदि ओवरलोडिंग जटिल हो रही है। अन्य तरीकों के लिए, कुछ मामलों का नाम बदलना या पैरामीटर ऑब्जेक्ट का उपयोग करने से मदद मिल सकती है। यह तब होता है जब आपके पास पर्याप्त जटिलता होती है जो अलग-अलग होती है। एक निश्चित मामला यह है कि आपको पैरामीटर के क्रम का उपयोग करके अंतर करना होगा, न केवल संख्या और प्रकार।


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

जैसा कि लिंक किए गए उत्तर में वर्णित है, बिल्डर पैटर्न आपको कोड लिखने देता है

Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
                 .name("Spicoli")
                 .age(16)
                 .motto("Aloha, Mr Hand")
                 .buildStudent();

जिसमें कुछ फ़ील्ड में डिफ़ॉल्ट मान हो सकते हैं या अन्यथा वैकल्पिक हो सकते हैं।


नहीं, लेकिन हमारे पास फ़ंक्शन ओवरलोडिंग के रूप में विकल्प है।

जब कोई पैरामीटर पारित नहीं किया जाता है

void operation(){

int a = 0;
int b = 0;

} 

जब "ए" पैरामीटर पारित किया गया था

void operation(int a){

int b = 0;
//code

} 

जब पैरामीटर बी पारित किया जाता है

void operation(int a , int b){
//code
} 

नहीं।

आप ऑब्जेक्ट को पास करके वही व्यवहार प्राप्त कर सकते हैं जिसमें स्मार्ट डिफ़ॉल्ट हैं। लेकिन फिर यह निर्भर करता है कि आपका मामला क्या है।


मैं यहां स्पष्ट बता रहा हूं लेकिन क्यों न केवल "डिफ़ॉल्ट" पैरामीटर को लागू करें?

public class Foo() {
        public void func(String s){
                func(s, true);
        }
        public void func(String s, boolean b){
                //your code here
        }
}

डिफ़ॉल्ट के लिए आप उपयोग करेंगे

func ("मेरी स्ट्रिंग");

और यदि आप डिफ़ॉल्ट का उपयोग नहीं करना चाहते हैं, तो आप इसका उपयोग करेंगे

func ("मेरी स्ट्रिंग", झूठी);


यह समर्थित नहीं है लेकिन कुछ वाक्यविन्यास चीनी के साथ पैरामीटर ऑब्जेक्ट पैटर्न का उपयोग करने जैसे कई विकल्प हैं:

public class Foo() {
    private static class ParameterObject {
        int param1 = 1;
        String param2 = "";
    }

    public static void main(String[] args) {
        new Foo().myMethod(new ParameterObject() {{ param1 = 10; param2 = "bar";}});
    }

    private void myMethod(ParameterObject po) {
    }
}

इस नमूने में हम ParameterObject { param1 = 10; param2 = "bar";} को डिफ़ॉल्ट मानों के साथ { param1 = 10; param2 = "bar";} हैं और क्लास इंस्टेंस प्रारंभिक अनुभाग { param1 = 10; param2 = "bar";} { param1 = 10; param2 = "bar";}


https://.com/a/13864910/2323964 लिए एक समान दृष्टिकोण जो जावा 8 में काम करता है वह डिफ़ॉल्ट गेटर्स के साथ एक इंटरफेस का उपयोग करना है। यह अधिक सफेद जगह वर्बोज़ होगा, लेकिन यह मजाकिया है, और यह बहुत अच्छा है जब आपके पास ऐसे उदाहरण हैं जहां आप वास्तव में पैरामीटर पर ध्यान आकर्षित करना चाहते हैं।

public class Foo() {
    public interface Parameters {
        String getRequired();
        default int getOptionalInt(){ return 23; }
        default String getOptionalString(){ return "Skidoo"; }
    }

    public Foo(Parameters parameters){
        //...
    }

    public static void baz() {
        final Foo foo = new Foo(new Person() {
            @Override public String getRequired(){ return "blahblahblah"; }
            @Override public int getOptionalInt(){ return 43; }
        });
    }
}




method-overloading