জাভা কি ডিফল্ট প্যারামিটার মানগুলিকে সমর্থন করে?


1660

আমি কয়েকটি জাভা কোড জুড়ে এসেছি যার নিম্নলিখিত কাঠামো ছিল:

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);

জাভা কি এই জাতীয় সিনট্যাক্স সমর্থন করে? এই দুটি পদক্ষেপের সিনট্যাক্সটি বেশি পছন্দ করার কারণ রয়েছে কি?


85
নাহ, তবে বিল্ডার প্যাটার্ন সাহায্য করতে পারে।
ডেভ জার্ভিস

50
আমি এই বৈশিষ্ট্যটি সত্যিই মিস করছি। কোনও কোড বা কনস্ট্রাক্টরের অতিরিক্ত প্যারামিটার নিতে বিদ্যমান কোডটি সংশোধন করার সময় এটি অনেক সাহায্য করে
যতিন

4
@ জাটিন গ্রহগ্রহের সাথে "পরিবর্তন পদ্ধতি স্বাক্ষর" রিফ্যাক্টরিংয়ের সাহায্যে আপনি একটি প্যারামিটার যুক্ত করতে পারেন এবং একটি ডিফল্ট মান প্রদান করতে পারেন যা বিদ্যমান চালকরা ব্যবহার করবে।
এরউইন বোলভিড

2
টুইটারে আমি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করছি এবং এটিতে পদ্ধতিটি পুনর্বিবেচিত করার এবং ডিফল্ট মান সরবরাহ করার বিকল্প রয়েছে। বেশ কার্যকর।
যতীন

3
@temporary_user_name public MyParameterizedFunction(String param1, int param2)একটি নির্মাণকারী, পদ্ধতি নয়, ঘোষণা।
মারিও ইসহাক

উত্তর:


955

না, আপনি যে কাঠামোটি পেয়েছেন সেটি হ'ল জাভা কীভাবে এটি পরিচালনা করে (এটি ডিফল্ট প্যারামিটারগুলির পরিবর্তে ওভারলোডিং সহ)।

নির্মাণকারীদের জন্য, কার্যকর জাভা দেখুন: প্রোগ্রামিং ল্যাঙ্গুয়েজ গাইডের আইটেম 1 টিপ (ওভারলোডিং জটিল হয়ে উঠলে কনস্ট্রাক্টরের পরিবর্তে স্থির কারখানার পদ্ধতিগুলি বিবেচনা করুন)। অন্যান্য পদ্ধতির জন্য, কিছু ক্ষেত্রে নতুন নামকরণ বা প্যারামিটার অবজেক্ট ব্যবহার করা সহায়তা করতে পারে। এটি যখন আপনার পর্যাপ্ত জটিলতা থাকে তবে পার্থক্য করা কঠিন। একটি নির্দিষ্ট ক্ষেত্রে হ'ল যেখানে আপনাকে কেবল সংখ্যা এবং টাইপ নয়, পরামিতিগুলির ক্রম ব্যবহার করে আলাদা করতে হবে।


25
এটি ছিল ২০০৯ সালে, যে staticকোনও কিছুই 2015 সালে ক্ষতিকারক হিসাবে বিবেচিত হয় Type Builderসম্পূর্ণ এবং বৈধ নির্মাণ চুক্তি প্রয়োগকারী নিরাপদ অনর্গল দৃষ্টান্তগুলি এখন আরও অনেক ভাল সমাধান।

135
@ জারোদরবারসন: স্থির কারখানার পদ্ধতিগুলি এর চেয়ে বেশি ক্ষতিকারক নয় new। তারা হয় ব্যবহৃত সব সময় নতুন কোডে। সাধারণ মান সামগ্রীর জন্য নির্মাতারা প্রায়শই ওভার ইঞ্জিনিয়ারিংয়ের ফলাফল।
লই

12
@ জারোদরবারসন: সংকলকটির মাধ্যমে সঠিকভাবে জোর করে বলার আকর্ষণীয় উপায়, ভাগ করে নেওয়ার জন্য ধন্যবাদ! ভবিষ্যতের পোস্টগুলির জন্য বন্ধুত্বপূর্ণ পরামর্শ: অসম্পূর্ণ উত্স কোডের 300 লাইন বেশিরভাগ লোকের পক্ষে হজম করার জন্য কিছুটা সম্ভবত (কোড লেখার চেয়ে পড়ার চেয়ে কঠিন, সর্বোপরি)। আবার ধন্যবাদ!
খ্রিস্টান আইচিংগার

17
@ জারোডরোবারসন: চমৎকার, এটির অপেক্ষায়! আমি কী যোগাযোগ করতে চেয়েছিলাম: আপনার ব্লগের পাঠক হিসাবে, কী চলছে তার সংক্ষিপ্ত পাঠ্য বিবরণ সহ একটি 50 রেখার উদাহরণ আমাকে প্রসঙ্গ ছাড়াই 300 টিরও বেশি লাইনের সহায়তা করবে।
খ্রিস্টান আইচিংগার

8
@ ব্যবহারকারী 177800 অসম্মতি - খাঁটি ফাংশন হিসাবে লেখা থাকলে স্থির পদ্ধতিগুলি পুরোপুরি ঠিক আছে। এটি যখন কোনও স্থির ফাংশন পরিবর্তিত হয় যে তারা সমস্যা হয়ে যায় ...
লেভি ফুলার

641

না, তবে আপনি বিল্ডার প্যাটার্নটি ব্যবহার করতে পারেন এই স্ট্যাক ওভারফ্লো উত্তরে বর্ণিত হিসাবে ।

লিঙ্কিত উত্তরে বর্ণিত হিসাবে, বিল্ডার প্যাটার্ন আপনাকে কোডটি লিখতে দেয়

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

যার মধ্যে কিছু ক্ষেত্রে ডিফল্ট মান থাকতে পারে বা অন্যথায় alচ্ছিক হতে পারে।


141
অবশেষে 2-পৃষ্ঠাগুলির তুলনায় বিল্ডার প্যাটার্নের দুর্দান্ত উদাহরণ।
নেভভারমাইন্ড

14
যদিও আমি কৌতূহলী, কেন আমাদের যখন বিল্ডার প্যাটার্ন ব্যবহার করা হয় তখন একজন বিল্ডার শ্রেণি প্রয়োজন। আমি স্টুডেন্ট s1 = নতুন স্টুডেন্ট () নাম ("স্পিকোলো")। বয়স (16) .মোটো ("অ্যালোহা, মিঃ হ্যান্ড);
ivanceras

52
@ আইভান্সরাস: ক্লাসের ক্ষেত্রে ক্ষেত্রের প্রয়োজন হলে এটি প্রাসঙ্গিক হয় এবং আপনি এই ক্লাসগুলিকে একটি অবৈধ অবস্থায় ইনস্ট্যান্ট করতে সক্ষম হতে চান না। সুতরাং আপনি যদি ঠিক Student s1 = new Student().age(16);তখনই বলে থাকেন তবে এটি আপনাকে নাম ছাড়াই কোনও শিক্ষার্থীর সাথে ছেড়ে দেবে, যা খারাপ হতে পারে। যদি এটি খারাপ না হয় তবে আপনার সমাধানটি ভাল।
এলি কোর্টরাইট

57
@ আইভান্সারস: অন্য কারণ হ'ল আপনি চান যে আপনার ক্লাসটি নির্মাণের পরে স্থাবর হতে পারে, সুতরাং আপনি এর মধ্যে এমন কোনও পদ্ধতি চাইবেন না যা এর মান পরিবর্তন করে।
জুলাই

3
@ আইভান্সরাস: আমি বিল্ডারগুলিকে 3 টি জিনিসের জন্য ব্যবহার করেছি - একাধিক যুক্তি এবং সাবলীল সূচনা, অপরিবর্তনীয়তা দূর করে এবং সবচেয়ে গুরুত্বপূর্ণভাবে আমি বিল্ড () পদ্ধতিতে ডোমেন অবজেক্টকে বৈধতা দিতে অনুভব করি Wআমি যদি অবৈধ হয়ে থাকে তবে কোনও অবজেক্টের উদাহরণ তৈরি করুন You আপনি স্থির ওভারলোডও করতে পারেন উপরের ক্ষেত্রে বিল্ডফ্রেশম্যান (), বিল্ডসিনিয়র () ইত্যাদির মতো কারখানার পদ্ধতিগুলি
অভিজিৎ কুশে

485

জাভাতে ডিফল্ট পরামিতিগুলি অনুকরণ করার বিভিন্ন উপায় রয়েছে:

  1. পদ্ধতি ওভারলোডিং।

    void foo(String a, Integer b) {
        //...
    }
    
    void foo(String a) {
        foo(a, 0); // here, 0 is a default value for b
    }
    
    foo("a", 2);
    foo("a");

    এই পদ্ধতির একটি সীমাবদ্ধতা হ'ল যদি একই ধরণের দুটি optionচ্ছিক পরামিতি থাকে এবং সেগুলির কোনও বাদ দেওয়া যায় তবে এটি কাজ করে না।

  2. ভারার্গস।

    ক) সমস্ত alচ্ছিক পরামিতি একই ধরণের:

    void foo(String a, Integer... b) {
        Integer b1 = b.length > 0 ? b[0] : 0;
        Integer b2 = b.length > 1 ? b[1] : 0;
        //...
    }
    
    foo("a");
    foo("a", 1, 2);

    খ) paraচ্ছিক পরামিতিগুলির প্রকারগুলি পৃথক হতে পারে:

    void foo(String a, Object... b) {
        Integer b1 = 0;
        String b2 = "";
        if (b.length > 0) {
          if (!(b[0] instanceof Integer)) { 
              throw new IllegalArgumentException("...");
          }
          b1 = (Integer)b[0];
        }
        if (b.length > 1) {
            if (!(b[1] instanceof String)) { 
                throw new IllegalArgumentException("...");
            }
            b2 = (String)b[1];
            //...
        }
        //...
    }
    
    foo("a");
    foo("a", 1);
    foo("a", 1, "b2");

    এই পদ্ধতির মূল অপূর্ণতা হ'ল alচ্ছিক পরামিতিগুলি যদি বিভিন্ন ধরণের হয় তবে আপনি স্ট্যাটিক ধরণের চেকিং হারাবেন। তদুপরি, যদি প্রতিটি প্যারামিটারের আলাদা অর্থ থাকে তবে এগুলি আলাদা করার জন্য আপনার কিছু উপায় প্রয়োজন।

  3. NULLs। পূর্ববর্তী পদ্ধতির সীমাবদ্ধতাগুলি সমাধান করার জন্য আপনি নাল মানগুলিকে অনুমতি দিতে পারেন এবং তারপরে কোনও পদ্ধতিতে প্রতিটি পরামিতি বিশ্লেষণ করতে পারেন:

    void foo(String a, Integer b, Integer c) {
        b = b != null ? b : 0;
        c = c != null ? c : 0;
        //...
    }
    
    foo("a", null, 2);

    এখন সমস্ত আর্গুমেন্টের মান অবশ্যই সরবরাহ করতে হবে তবে ডিফল্ট মানগুলি শূন্য হতে পারে।

  4. .চ্ছিক ক্লাস। এই পদ্ধতির নালগুলির অনুরূপ, তবে পূর্বনির্ধারিত মান রয়েছে এমন পরামিতিগুলির জন্য জাভা 8 ptionচ্ছিক ক্লাস ব্যবহার করে:

    void foo(String a, Optional<Integer> bOpt) {
        Integer b = bOpt.isPresent() ? bOpt.get() : 0;
        //...
    }
    
    foo("a", Optional.of(2));
    foo("a", Optional.<Integer>absent());

    Ptionচ্ছিক কোনও কলারের জন্য কোনও পদ্ধতির চুক্তিকে সুস্পষ্ট করে তোলে, তবে, এই জাতীয় স্বাক্ষরটি খুব ভার্বোস খুঁজে পেতে পারে।

  5. বিল্ডার প্যাটার্ন। বিল্ডার প্যাটার্নটি নির্মাণকারীদের জন্য ব্যবহৃত হয় এবং আলাদা বিল্ডার শ্রেণি প্রবর্তন করে প্রয়োগ করা হয়:

     class Foo {
         private final String a; 
         private final Integer b;
    
         Foo(String a, Integer b) {
           this.a = a;
           this.b = b;
         }
    
         //...
     }
    
     class FooBuilder {
       private String a = ""; 
       private Integer b = 0;
    
       FooBuilder setA(String a) {
         this.a = a;
         return this;
       }
    
       FooBuilder setB(Integer b) {
         this.b = b;
         return this;
       }
    
       Foo build() {
         return new Foo(a, b);
       }
     }
    
     Foo foo = new FooBuilder().setA("a").build();
  6. মানচিত্র। যখন প্যারামিটারের সংখ্যা খুব বেশি থাকে এবং তাদের বেশিরভাগের জন্য সাধারণত ডিফল্ট মান ব্যবহৃত হয়, আপনি তাদের নাম / মানগুলির মানচিত্র হিসাবে পদ্ধতি যুক্তিগুলি পাস করতে পারেন:

    void foo(Map<String, Object> parameters) {
        String a = ""; 
        Integer b = 0;
        if (parameters.containsKey("a")) { 
            if (!(parameters.get("a") instanceof Integer)) { 
                throw new IllegalArgumentException("...");
            }
            a = (String)parameters.get("a");
        } else if (parameters.containsKey("b")) { 
            //... 
        }
        //...
    }
    
    foo(ImmutableMap.<String, Object>of(
        "a", "a",
        "b", 2, 
        "d", "value")); 

অনুগ্রহ করে নোট করুন যে আপনি পছন্দসই ফলাফল অর্জন করতে এই যে কোনও পদ্ধতির একত্রিত করতে পারেন।


1
ভাল ব্যাখ্যা। আমি এর আগে ফেরতের মানগুলি কখনও ব্যবহার করতে দেখিনি। 5) কি return thisকরবেন? এছাড়াও, FooBuilder().setA("a").build();যেহেতু (সংজ্ঞায়িতভাবে) কনস্ট্রাক্টরকে প্রথমে ডাকা হয় এবং FooBuilder()কোনও মান ফেরত দেয়, এর অর্থ .setA("a"):এই নয় যে ডাকার সুযোগ পাবে না?
সেলেরিটাস

3
@ চেরিরিটাস return thisএকই পদার্থটি প্রদান করে যার উপর পদ্ধতিটি বলা হয়েছিল (উদাহরণস্বরূপ FooBuilder)। এটি একই পদার্থে অভিনয় করে একটি স্টেটমেন্টে পদ্ধতিগুলির শৃঙ্খলাবদ্ধ করতে দেয়: new FooBuilder().setA(..).setB(..).setC(..)ইত্যাদি পৃথক বিবৃতিতে প্রতিটি পদ্ধতি কল করার বিরোধিতা করে।
এডিটিসি

2
@ চেরিরিটাস এমন new FooBuilder()একটি FooBuilderবস্তু প্রদান করে যার উপরে setAপদ্ধতিটি বলা হয়। যেমন setBবলা হয় না, this.bডিফল্ট মান ধরে রাখে। অবশেষে buildপদ্ধতিটি এই FooBuilderঅবজেক্টে কল করা হয়। buildপদ্ধতি তৈরি করে এবং একটি ফেরৎ Fooবস্তুর পরিবর্তনশীল সেট করা হয় Foo foo। লক্ষ্য করুন যে FooBuilderবস্তুটি কোনও ভেরিয়েবলে সংরক্ষণ করা হয়নি।
এডিটিসি

ডিফল্ট পরামিতিগুলি তৈরি করতে টিক চিহ্নও ব্যবহার করা যেতে পারে এবং পলিমারফিক সংগ্রহের জন্য প্রয়োজনীয় হলে সর্বাধিক কার্যকর। docs.oracle.com/javase/tutorial/java/annotations/declaring.html
মার্টিন স্প্যামার

1
দুটি প্রশ্নের জুড়ে একই উত্তরের 900 টিরও বেশি আপগেট। আমি অভিভূত: stackoverflow.com/questions/965690/java-optional-parameters/...
AdamMc331

256

দুঃখের বিষয়, না।


34
এটা কি খুব খারাপ? এটি করার ফলে সম্ভাব্য অস্পষ্ট ফাংশন স্বাক্ষরগুলি প্রবর্তিত হবে।
ট্রে

69
@ ট্রে: ডিফল্ট প্যারামিটারগুলির সাথে প্রায়শই ভাষা কম ফাংশন ওভারলোডিং ডাইচ করে কারণ এটি তখন কম বাধ্য হয়। সুতরাং কোন অস্পষ্টতা নেই। পাশেই, স্কেলা বৈশিষ্ট্যটি ২.৮-এ যুক্ত করেছে এবং কোনওভাবেই অস্পষ্টতার সমস্যা সমাধান করেছে (যেহেতু তারা সামঞ্জস্যের কারণে ওভারলোডিংটি সামঞ্জস্য রেখেছিল)।
ফিলিহো

32
পরামিতি ডিফল্টগুলি কীভাবে ফাংশন ওভারলোডিংকে বাধা দেয় তা দেখতে আমি ব্যর্থ। উদাহরণস্বরূপ সি # ওভাররাইডগুলিকে অনুমতি দেয় এবং ডিফল্ট আরম্ভের জন্যও অনুমতি দেয়। নির্বিচার পছন্দ হিসাবে মনে হয়, সীমাবদ্ধতা কারণ হয় না।
ফ্ল্যাভারস্পেকেপ

51
হ্যাঁ, সংকলকটিকে কিছু অতিরিক্ত কাজ করার পরিবর্তে বাণিজ্য করতে দিন এবং পরিবর্তে আমাদের সবাইকে আমাদের লাইব্রেরি ব্যবহারকারীদের সুবিধার্থে 100000 ওভারলোড লিখতে বাধ্য করুন। ভাল ধারণা.

28
@ ইউজার 66২6666:: আমি যখনই কোনও জাভা প্রকল্পে কাজ করি তখন আমি বুঝতে পারি যে জাভা ডেভেলগুলি প্রতিদিন তারা যে পরিমাণ লাইন কোড উত্পন্ন করে তা প্রদান করে / পরিমাপ করা হয়
মার্ক কে কোয়ান

83

দুর্ভাগ্যবশত হ্যাঁ.

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

জাভা 1.5 তে লিখিত হতে পারে:

void MyParameterizedFunction(String param1, int param2, Boolean... params) {
    assert params.length <= 1;
    bool param3 = params.length > 0 ? params[0].booleanValue() : false;
}

কম্পাইলার তৈরির ক্ষেত্রে আপনার কেমন লাগছে তার উপর আপনার নির্ভর করা উচিত কিনা

new Boolean[]{}

প্রতিটি কল জন্য।

একাধিক ডিফল্টযোগ্য পরামিতিগুলির জন্য:

void MyParameterizedFunction(String param1, int param2, bool param3=false, int param4=42) {}

জাভা 1.5 তে লিখিত হতে পারে:

void MyParameterizedFunction(String param1, int param2, Object... p) {
    int l = p.length;
    assert l <= 2;
    assert l < 1 || Boolean.class.isInstance(p[0]);
    assert l < 2 || Integer.class.isInstance(p[1]);
    bool param3 = l > 0 && p[0] != null ? ((Boolean)p[0]).booleanValue() : false;
    int param4 = l > 1 && p[1] != null ? ((Integer)p[1]).intValue() : 42;
}

এটি সি ++ সিনট্যাক্সের সাথে মেলে যা পরামিতি তালিকার শেষে ডিফল্ট প্যারামিটারগুলিকেই মঞ্জুরি দেয়।

সিনট্যাক্সের বাইরে, সেখানে পার্থক্য রয়েছে যেখানে এটি পাসের ডিফল্টযোগ্য পরামিতিগুলির জন্য টাইম টাইপ চেকিং করেছে এবং সংকলনের সময় সি ++ টাইপ তাদের পরীক্ষা করে।


14
চতুর, তবে ভারার্গস (...) কেবলমাত্র চূড়ান্ত প্যারামিটারের জন্য ব্যবহার করা যেতে পারে, যা ডিফল্ট প্যারামিটারগুলি সমর্থন করে এমন ভাষাগুলির তুলনায় আরও সীমাবদ্ধ।
কার্টেনডগ

6
সি ++ সংস্করণের সাথে তুলনায় এটি চালাক তবে কিছুটা অগোছালো
কেউ কেউ কোথাও

5
জাভা অবশ্যই সি # এবং অন্যদের অনুমতি হিসাবে alচ্ছিক ডিফল্ট প্যারামিটারগুলির প্রয়োজন ... বাক্য গঠনটি সুস্পষ্ট এবং আমার ধারণা তারা কেবলমাত্র সমস্ত সম্ভাব্য সংমিশ্রণগুলি সংকলন করেও এটিকে মোটামুটিভাবে বাস্তবায়ন করতে পারে ... তারা কেন এটি ভাষায় যুক্ত করেনি তা আমি কল্পনা করতে পারি না এখনো!
jwl

10
একটিকে কখনই assertউত্পাদন কোড ব্যবহার করা উচিত নয় । একটি ব্যতিক্রম নিক্ষেপ।
মাইকেল ডার্স্ট

5
-1 এটি ভারারাগ্স যা আসলে তা নয়। এটি একটি হ্যাক। - এই ক্ষেত্রে, ওভারলোডগুলি ব্যবহার করা আরও পঠনযোগ্য হবে (যা দুর্ভাগ্যজনক, যেহেতু তিনটি অতিরিক্ত অক্ষরের উত্সের অতিরিক্ত 5 টি লাইনের চেয়ে বেশি পঠনযোগ্য ...)। - তবে জাভা ডিফল্ট পরামিতিগুলিকে সমর্থন করে না।
BrainSlugs83

38

না, তবে আপনি খুব সহজেই এগুলি অনুকরণ করতে পারেন। সি ++ এ যা ছিল:

public: void myFunction(int a, int b=5, string c="test") { ... }

জাভাতে এটি একটি ওভারলোডেড ফাংশন হবে:

public void myFunction(int a, int b, string c) { ... }

public void myFunction(int a, int b) {
    myFunction(a, b, "test");
}

public void myFunction(int a) {
    myFunction(a, 5);
}

এর আগে উল্লেখ করা হয়েছিল, ডিফল্ট পরামিতিগুলি ফাংশন ওভারলোডিংয়ের ক্ষেত্রে দ্ব্যর্থক কেস সৃষ্টি করে। এটি কেবল সত্য নয়, আমরা সি ++ এর ক্ষেত্রে দেখতে পারি: হ্যাঁ, এটি দ্ব্যর্থক ক্ষেত্রে তৈরি করতে পারে তবে এই সমস্যাগুলি সহজেই পরিচালনা করা যায়। এটি জাভাতে কেবল বিকশিত হয়নি, সম্ভবত কারণ যে নির্মাতারা সি ++ হিসাবে অনেক সহজ ভাষা চেয়েছিলেন - তাদের যদি অধিকার থাকে তবে অন্য প্রশ্ন। তবে আমাদের মধ্যে অনেকেই ভাবেন না যে তিনি জাভা ব্যবহার করেছেন এর সরলতার কারণে।


8
সি # ডিফল্ট মান স্বরলিপিটির মূল ধারণাটি এই বয়লারপ্লেট কোডিংটি এড়ানো এবং অনেকের পরিবর্তে কেবলমাত্র একজন নির্মাতা রয়েছে to
কোল্যা ইভানকভ

1
@ কল্যাআইভানকভ আমি সি # জানি না, তবে আমি সি ++ জানি যেখানে যুক্তি একই। আমি আরও ভাল কি তা জানি না, তবে আমি মনে করি, আসলে একই বয়লারপ্লিট কোডটি সি ++ / সি # এর ক্ষেত্রে সংকলক দ্বারা উত্পাদিত হয়েছিল এবং এটি চূড়ান্ত বাইনারিতে চলেছে।
পিটারহ - মনিকা পুনরায় ইনস্টল করুন

5
প্রতিটি প্রোগ্রামিং ল্যাঙ্গুয়েজ (বিশেষত) এসেমব্লার বয়লারপ্লেট এড়ানোর উপায়, আমি কি ভুল করছি? প্রশ্নটি কেবল একটি কার্যকর কার্যকারিতা দেয় কি না is
কোল্যা ইভানকভ

2
প্রথম বাক্যটি একটি বাজে প্রশ্ন। দ্বিতীয় বাক্যে "প্রশ্ন" শব্দের প্রথমদিকে অলঙ্কৃত প্রশ্নটির সাথে কোনও সম্পর্ক নেই।
কোল্যা ইভানকভ

1
আরও সুনির্দিষ্ট হওয়া: ভাষাগুলি এমন একটি সরঞ্জাম যা আমাদের এমনভাবে প্রোগ্রাম লেখার মঞ্জুরি দেয় যা লেখা থাকে তার উপর আমাদের নিয়ন্ত্রণ থাকতে পারে, সংকলন একটি মেশিনকে আমরা এটি থেকে কী চাই তা বলার উপায়। একটি সরঞ্জাম আরও কার্যকর যদি এটি আমাদের বয়লারপ্লেট এড়াতে দেয় allows বাস্তবে, গানভী জিজ্ঞাসা করেছিলেন, আপনি উত্তর হিসাবে প্রস্তাবিত বয়লারপ্লেট কোডের ধরণটি যদি তারা সঠিকভাবে এড়াতে পারেন তবে সি # এটির জন্য অনুমতি দেয়।
কোল্যা ইভানকভ

24

আপনি এটি স্ক্যালায় করতে পারেন, যা জেভিএম এ চলে এবং জাভা প্রোগ্রামগুলির সাথে সামঞ্জস্যপূর্ণ। http://www.scala-lang.org/

অর্থাত

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

58
এমন একটি সাধারণ বৈশিষ্ট্য না পাওয়ার জন্য পুরো নতুন ভাষা নিয়ে আসুন?
সর্বজনীন-মনোনীত

8
@ ওম-নাম-নাম: জাভা কখনই থাকতে পারে না। কোনও বৈশিষ্ট্য ব্যবহৃত হয়নি বলে সমান যে কারও এটির প্রয়োজন নেই এটি বলছে যে জাভা আবিষ্কারের আগে জনপ্রিয় ছিল না তার অর্থ এই যে গসলিং এটির নকশা শুরু করা উচিত নয়।
Val,

28
@ ওয়াল কেবল বলছেন যে এটি কামান দিয়ে পাখিদের শুটিংয়ের মতো
ওম-নাম-মনোনীত

8
ওপি-র প্রশ্নের সাথে এর
কোনও যোগসূত্র নেই

কোটলিনেও কাজ করে। গ্রোভী এবং এবং সি #। এবং জাভাস্ক্রিপ্ট। এবং প্রায় সমস্ত অন্যান্য ভাষা যা প্রকৃত লোক এবং সমস্যার জন্য তৈরি।
স্পাইরো

17

না , তবে এটি কার্যকর করার সহজ উপায় হ'ল:

public myParameterizedFunction(String param1, int param2, Boolean param3) {

    param3 = param3 == null ? false : param3;
}

public myParameterizedFunction(String param1, int param2) {

    this(param1, param2, false);
}

বা টার্নারি অপারেটরের পরিবর্তে আপনি ব্যবহার করতে পারেন if:

public myParameterizedFunction(String param1, int param2, Boolean param3) {

    if (param3 == null) {
        param3 = false;
    }
}

public myParameterizedFunction(String param1, int param2) {

    this(param1, param2, false);
}

2
হ্যাঁ, এই বিকল্পটি অন্যান্য বিকল্পগুলির থেকে সেরা বলে মনে হচ্ছে। তবুও জাভা ডিফল্ট মানগুলি গ্রহণ করা ভাল হবে; কোটলিন দেখিয়েছিলেন যে এটি করা সম্ভব, সুতরাং আমি নিশ্চিত নই যে কেন ওরাকল আধুনিক যুগে প্রবেশ করছে না, এবং জাভা ডিজাইন করে চলেছে যেন 1990 এর দশকের মতো। : ডি
শেভি

13

আমি এখানে সুস্পষ্ট বক্তব্য রাখছি তবে কেন কেবল "ডিফল্ট" পরামিতিটি নিজেকে প্রয়োগ করবেন না?

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

ডিফল্ট জন্য, আপনি হয় ব্যবহার করবে

func("my string");

এবং আপনি যদি ডিফল্ট ব্যবহার করতে না চান তবে আপনি ব্যবহার করতে পারেন

func("my string", false);

11
পোস্টারে জিজ্ঞাসা করা হয়েছিল যে এটি (বরং কুৎসিত) প্যাটার্নটি এড়ানো যায় কিনা ... ;-) আরও আধুনিক ভাষায় (সি #, স্কালার মতো) আপনার অতিরিক্ত অতিরিক্ত বোঝা লাগবে না যা কেবলমাত্র আরও লাইন কোড তৈরি করে। কিছুটা অবধি আপনি এর মধ্যে ভ্যারার্গস ব্যবহার করতে পারেন (স্ট্যাটিক ইনট ম্যাক্স (ইন ... অ্যারে) {}), তবে এগুলি কেবল খুব কুৎসিত কাজ।
অফার 14

2
ওভারলোডিং কুরুচিপূর্ণ নয় এবং এর অনেকগুলি সুবিধা রয়েছে যেমন বিভিন্ন স্বাক্ষরযুক্ত বিভিন্ন পদ্ধতি কলগুলি বিভিন্ন কার্যকারিতা সম্পাদন করতে পারে। //This is better public class Foo() { /* This does something */ public void func(String s){ //do something } /* This does something else with b */ public void func(String s, boolean b){ // b was passed } } //Than this public class Foo() { /* This does something unless b = value, then it does something else */ public void func(String s, boolean b = value){ If (b){ // Do Something } else{ // Do something else } } }
অ্যান্টনি বুথ

ভাল, যদি কেউ ভিন্ন আচরণ চায়। যদি পার্থক্য হ'ল গণনা ইত্যাদির ক্ষেত্রে কিছুটা পরিবর্তন হয় তবে এটি নিশ্চিত যে একাধিক স্বাক্ষর তৈরির প্রচেষ্টা ব্যর্থ। ডিফল্টগুলি বোঝায় যে আপনার যেখানে তাদের দরকার ... এবং এর অভাবটিকে "অকেজো" প্রয়োজনীয় হিসাবে শ্রেণিবদ্ধ করা উচিত নয়।
কপিল

@ আধুনিক ডিফল্ট পরামিতিগুলির "আধুনিক ভাষা" এর সাথে কোনও সম্পর্ক নেই। আমি এগুলি 20 বছর আগে ডেলফিতে ব্যবহার করেছি এবং তারা সম্ভবত ইতিমধ্যে টার্বো পাস্কেলে বিদ্যমান।
অবিশ্বাস্য জানুয়ারী

আমি অফলারের সাথে একমত, এবং অ্যান্টনি বুথের সাথে একমত নই। আমি এটি দেখতে কেবল কুৎসিতই নয়, মোটামুটি অক্ষমও বোধ করি। রুবি বা পাইথনের মতো ভাষা ডিফল্ট প্যারামিটারগুলি ব্যবহার করার জন্য এটি তুচ্ছ করে তোলে; আমার ধারণা, জাভা আপনাকে যা করতে হবে তা হ'ল ওয়ার্কআউন্ডগুলি সন্ধান (এবং ব্যবহার)। সুস্পষ্ট চেক বনাম নালকে স্বল্পতম কুরুচিপূর্ণ পছন্দ বলে মনে হচ্ছে, যেহেতু আমি কমান্ডলাইন থেকেও এটি কল করতে পারি (কেবল কিছু সরবরাহ করবেন না, এবং তারপরে সংবেদনশীল রূপটি পরিচালনা করবেন); অপারেটর ওভারলোডিং পদ্ধতির কাছে মনে হচ্ছে ... খুব ভার্বোজ (নাল-চেকের তুলনায় কমপক্ষে +3 লাইন এবং কোডটি আরও জটিল হলে আরও লাইন)।
শেভি

8

যেমন স্কালার উল্লেখ ছিল, কোটলিনও উল্লেখযোগ্য worth কোটলিনে ফাংশন প্যারামিটারগুলিরও ডিফল্ট মান থাকতে পারে এবং তারা অন্যান্য পরামিতিগুলিকেও উল্লেখ করতে পারে:

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

স্কেলার মতো, কোটলিন জেভিএম-এ চলে এবং বিদ্যমান জাভা প্রকল্পগুলিতে সহজেই সংহত করা যায়।


6

না।

স্মার্ট ডিফল্ট রয়েছে এমন কোনও অবজেক্টকে পাস করার মাধ্যমে আপনি একই আচরণ অর্জন করতে পারেন। তবে আবার এটি নির্ভর করে যে আপনার ক্ষেত্রে কী আছে।


5

না। সাধারণভাবে জাভাতে খুব বেশি (কোনও) সিনট্যাকটিক চিনি নেই, যেহেতু তারা একটি সহজ ভাষা তৈরি করার চেষ্টা করেছিল।


26
বেশ না। তিক্ত সত্যটি হল দলটি একটি শক্ত শিডিয়ুলে ছিল এবং সিনট্যাকটিক চিনির জন্য সময় ছিল না had আর কেন constএবং gotoসংরক্ষিত কীওয়ার্ডগুলি কার্যকর হবে না? - বিশেষত constএমন একটি জিনিস যা আমি খুব খারাপভাবে মিস করি - finalএটি কোনও প্রতিস্থাপন নয় এবং তারা এটি জানত। - এবং আপনি যদি কখনও বাস্তবায়ন না করার জন্য সচেতন সিদ্ধান্ত নেন তবে আপনাকে gotoকীওয়ার্ড সংরক্ষণ করার প্রয়োজন হবে না। - এবং পরে জাভা টিম লেবেলকে ভিত্তিক breakএবং continueপাস্কালের মতো শক্তিশালী করে প্রতারিত করে goto
মার্টিন

"সিম্পল, অবজেক্ট-ওরিয়েন্টড অ্যান্ড ফিনিড
মাইক্রা

1
টমজেন বলেছিলেন: "না। সাধারণভাবে জাভাতে খুব বেশি (কোনও) সিনট্যাকটিক চিনি নেই, যেহেতু তারা একটি সহজ ভাষা তৈরি করার চেষ্টা করেছিল"। সুতরাং আপনি বলছেন যে সি ++ থেকে প্রচুর অপ্রয়োজনীয় বৈশিষ্ট্য অপসারণ করা একটি জাভাকে একটি সাধারণ ভাষা করে তোলে, তবে আমাকে বলুন কেন জাভাতে বৈচিত্র্যমূলক পদ্ধতি রয়েছে? কেন এটির ভার্জ রয়েছে? এর পরিবর্তে যদি আপনি কেবল বস্তুর একটি অ্যারে ব্যবহার করতে পারেন তবে আমি ঠিক আছি? সুতরাং ভাষা থেকে ভেরাগগুলি সরানো যেতে পারে, কারণ এটি অপ্রয়োজনীয়। এটি জাভা এখনকার চেয়ে আরও সহজ করে তুলবে। আমি কি সঠিক? ওভারলোডিংও মুছে ফেলা যায়, কারণ আপনার প্রতিটি পদ্ধতির অসীম নাম।

1
এবং সে কারণেই আমরা স্প্রিং এবং স্টাফ পেয়েছি যা সহজ ভাষা নিয়ে যায় এবং যেকোন আসল জাভা প্রকল্পকে সিনট্যাক্স এবং বয়লারপ্লেটের ক্লাস্টারফ্কে পরিণত করে :-)
ম্যাটানস্টার

ডেভসকে বয়লারপ্লেট কোড এবং জটিল কর্মকাণ্ডে বাধ্য করা "সহজ" শব্দের সম্পর্কে আমার বোঝার নয়। আমার ফাংশন (এ, বি = মিথ্যা, সি = 3), এটাকে আমি সহজ বলি।
স্পাইরো

5

পরিবর্তে ব্যবহার করুন:

void parameterizedMethod(String param1, int param2) {
    this(param1, param2, false);
}

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

আপনি একক পদ্ধতিতে জাভা এর ptionচ্ছিক কার্যকারিতা কাজে লাগাতে পারেন:

void parameterizedMethod(String param1, int param2, @Nullable Boolean param3) {
    param3 = Optional.ofNullable(param3).orElse(false);
    //use all three parameters here
}

মূল পার্থক্য হ'ল ইনপুটটিকে অনুমতি দেওয়ার জন্য আপনাকে আদিম জাভা প্রকারের পরিবর্তে মোড়ক ক্লাস ব্যবহার করতে হবে nullBooleanপরিবর্তে boolean, Integerপরিবর্তে intএবং আরও কিছু।


4

এটি সমর্থিত নয় তবে কয়েকটি সিনট্যাক্স চিনির সাথে প্যারামিটার অবজেক্ট প্যাটার্ন ব্যবহার করার মতো বিভিন্ন বিকল্প রয়েছে:

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";}



3

আপনি জাভা মেথড ইনভোকেশন বিল্ডার ব্যবহার করতে পারেন বিল্ডারটি ডিফল্ট মান সহ স্বয়ংক্রিয়ভাবে তৈরি ।

ক্লাসে কেবলমাত্র জেনারেট ম্যাথড ইনভোকেশনবিল্ডার বা ইন্টারফেস যুক্ত করুন এবং আপনি যেখানে ডিফল্ট মান চান সেই পদ্ধতিগুলিতে @ ডিফল্টটিকে প্যারামিটারে যুক্ত করুন। সংকলনের সময় কোনও বিল্ডার তৈরি করা হবে, আপনি আপনার টীকাগুলির সাহায্যে নির্দিষ্ট করা ডিফল্ট মান ব্যবহার করে।

@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);

2

Https://stackoverflow.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; }
        });
    }
}

2

মানগুলি ফিরিয়ে আনার পদ্ধতিগুলির সাথে এটি কীভাবে ব্যবহার করা যায় তা নির্ধারণ করার জন্য আমি এখন বেশ কিছুটা সময় ব্যয় করেছি এবং আমি এখন পর্যন্ত কোনও উদাহরণ দেখিনি, আমি ভেবেছিলাম এটি এখানে যুক্ত করা কার্যকর হতে পারে:

int foo(int a) {
    // do something with a
    return a;
}

int foo() {
    return foo(0); // here, 0 is a default value for a
}

1

এইভাবে আমি এটি করেছি ... এটি সম্ভবত আপনার সংজ্ঞায়িত প্যারামিটারের বিরুদ্ধে 'alচ্ছিক যুক্তি' দেওয়ার মতো সুবিধাজনক নয়, তবে এটি কাজটি করে:

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");
}

লক্ষ্য করুন আমি একই পদ্ধতির নামটি কেবল একটি স্ট্রিং দিয়ে প্রার্থনা করতে পারি বা আমি একটি স্ট্রিং এবং বুলিয়ান মান সহ এটি করতে পারি। এই ক্ষেত্রে, ওয়াইপক্লিনকে সত্যে সেট করা আমার টেক্সটরিয়ার সমস্ত পাঠ্য সরবরাহ করা স্ট্রিংয়ের সাথে প্রতিস্থাপন করবে। ওয়াইপক্লিয়েনটিকে মিথ্যা হিসাবে সেট করা বা এগুলি একসাথে ছেড়ে দেওয়া কেবল সরবরাহকৃত পাঠ্যটিকে টেক্সটআরিয়ায় যুক্ত করে।

এছাড়াও লক্ষ্য করুন যে আমি দুটি পদ্ধতিতে কোডটি পুনরাবৃত্তি করছি না, কেবল যুক্ত বুলেটিনের সাথে একই নামের সাথে একটি নতুন পদ্ধতি তৈরি করে আমি কেবল টেক্সটএরিয়া পুনরায় সেট করতে সক্ষম হওয়ার কার্যকারিতা যুক্ত করছি।

আমি আসলে মনে করি এটি জাভা আমাদের প্যারামিটারগুলির জন্য 'alচ্ছিক যুক্তি' সরবরাহ করায় যেহেতু আমাদের তখন ডিফল্ট মানগুলির জন্য কোড প্রয়োজন etc. উদাহরণস্বরূপ, এটি সম্পর্কে একটু চিন্তা করার দরকার নেই a হ্যাঁ, আমি আমার ক্লাসে আরও একটি পদ্ধতি যুক্ত করেছি, তবে দীর্ঘ সময় ধরে আমার নম্র মতামতটি পড়া সহজ।


1

না, তবে ফাংশন ওভারলোডিং আকারে আমাদের বিকল্প রয়েছে।

কোনও প্যারামিটার পাস না হলে বলা হয়

void operation(){

int a = 0;
int b = 0;

} 

"একটি" পরামিতি পাস করার পরে ডাকা হয় called

void operation(int a){

int b = 0;
//code

} 

প্যারামিটার বি পাস করার সময় বলা হয়

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

1

এর মতো অর্ধ ডজন বা আরও ভাল সমস্যা রয়েছে, অবশেষে, আপনি স্থির কারখানার প্যাটার্নে এসে পৌঁছে ... এর জন্য ক্রিপ্টো এপিআই দেখুন। শক্তভাবে ব্যাখ্যা করতে বাছাই করুন, তবে এটিকে এভাবে ভাবুন: আপনার যদি কোনও নির্মাণকারী, ডিফল্ট বা অন্য কোনওভাবে থাকে তবে কোঁকড়ানো ধনুর্বন্ধনীগুলির বাইরেও রাষ্ট্রের প্রচারের একমাত্র উপায় হয় বুলিয়ান ইসলাইজ হওয়া; (ডিফল্ট মান v ব্যর্থ কন্সট্রাক্টর হিসাবে নালটি সহ) বা ক্ষেত্রের ব্যবহারকারীদের কাছ থেকে ফিরে পাওয়ার সময় কোনও তথ্যযুক্ত না এমন একটি ব্যতিক্রম নিক্ষেপ করুন।

কোড কারেক্টকে তিরস্কার করা হবে, আমি হাজার লাইনের কনস্ট্রাক্টর লিখি এবং আমার যা প্রয়োজন তা করি। আমি অবজেক্ট কনস্ট্রাক্টে ইস্পালিড ব্যবহার করে দেখতে পাই - অন্য কথায় দ্বি-লাইন কনস্ট্রাক্টর - তবে কোনও কারণে আমি স্থিতিশীল কারখানার প্যাটার্নে স্থানান্তরিত করছি। আমি কেবল মনে করি আপনি যদি কোনও পদ্ধতিতে কল করেন, আপনি এখনও অনেক কিছু করতে পারেন তবে এখনও সিঙ্ক () সমস্যা রয়েছে তবে ডিফল্টগুলি 'প্রতিস্থাপিত' আরও ভাল (নিরাপদ) হতে পারে

আমি মনে করি আমাদের এখানে যা করা দরকার তা হ'ল স্ট্রিং ওয়ান = নতুন স্ট্রিং ("") ডিফল্ট মান হিসাবে নাল ইস্যুটির সমাধান; সদস্য ভেরিয়েবল হিসাবে, তারপরে কনস্ট্রাক্টরকে স্ট্রিং সরবরাহ করার আগে নাল পরীক্ষা করে দেখুন

জাভাতে কাঁচা, স্ট্র্যাটোস্ফেরিক কম্পিউটার বিজ্ঞানের পরিমাণ খুব লক্ষণীয়।

সি ++ ইত্যাদির মধ্যে বিক্রেতার স্বাদ রয়েছে, হ্যাঁ। বিশাল আকারের টুলবক্সের কারণে জাভা এগুলি তাদের বড় আকারের সার্ভারগুলিতে ছাড়িয়ে যেতে পারে। স্ট্যাটিক ইনিশিয়ালাইজার ব্লকগুলি অধ্যয়ন করুন, আমাদের সাথে থাকুন।



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.