هل التحميل الزائد هو الطريقة الوحيدة للحصول على القيم الافتراضية لمعلمات الطريقة في Java؟

StackOverflow https://stackoverflow.com/questions/618276

  •  03-07-2019
  •  | 
  •  

سؤال

أنا جديد تمامًا في استخدام Java وفي Python وPHP، وقد اعتدت على القيم الافتراضية لمعلمات الوظائف.

لذلك، لدي عادة كتابة أساليب مصممة ليتم استدعاؤها من مواقف مختلفة قليلاً حيث تريد تعيين بعض القيم فقط.على سبيل المثال، في كود PHP الخاص بي، سيكون هذا أمرًا شائعًا عندما يكون لدي أساليب مصنع توفر مثيلات كائن بخصائص مختلفة قليلاً.

في Java، يبدو أنه يجب أن يكون لدي طريقة واحدة تتوقع جميع المعلمات ثم العديد من الأشكال المحملة بشكل زائد والتي من شأنها استدعاء هذه الطريقة مع تعيين بعض المعلمات على الإعدادات الافتراضية وبعضها يوفره المتصل.وهو أمر جيد، لكنه قد يثير أعصابي في بعض الأحيان.

أتذكر أن هذا أزعجني بالفعل في بعض الرحلات القصيرة إلى C++ وActionScript.الآن، هل لدى مطوري Java الأكثر خبرة بعض الاختصارات لهذا؟

يبدو لي أنه من الناحية الفنية، تمت الإجابة على السؤال من خلال مجموع جميع المشاركات بـ "نعم، إنه كذلك".لقد قمت بفتح منشور ويكي أدناه لجمع الحلول البديلة المتنوعة، يرجى المساهمة إذا أردت.لقد وجدت كل هذه الأشياء مفيدة جدًا كمصدر إلهام وأمثلة تعليمية لبنيات Java النموذجية.

هل كانت مفيدة؟

المحلول 6

ويبدو مثل: "نعم، انه" فيما عدا:

ويمكن تحقيق

وآثار مماثلة مع varargs كما اقترح بول ويلان أو عن طريق تحديد نوع إضافي يحمل المعلمات كحقول مع القيم الافتراضية الصحيحة على النحو الذي اقترحه جون السكيت. بوريس بافلوفيتش يضيف هذا النوع له يمكن أن يكون الطبقة الداخلية ثابتة لابقاء الامور بدقة في المكان الصحيح.

وسلبيات (لاحظ أن هذه المسألة برمتها ليست عن أي تداعيات خطيرة، فقط حول القرص مريحة):

وVarargs تبدو أكثر مناسبة لتمرير قائمة متغيرة الطول من القيم التي لها شكل مشابه جدا والمعنى في الغالب ما يعادلها، مثل قائمة الأسماء. إذا ما استخدمت للغرض المذكور في السؤال، فإن لديهم طريقة لتنفيذ اختبارات مختلفة على قائمة من أجل تفسير ذلك، وهو ما يبدو لم يكن أكثر، ولكن أقل ملاءمة.

وهناك نوع خاص يحمل المعلمات يبدو أكثر فائدة إذا كان نوع الناجم عن ذلك قد يكون من الاستخدامات الأخرى من مجرد يتم تمريرها إلى أسلوب واحد معين، أو عندما يكون مجموعة أكثر تعقيدا من المعلمات. إذا كان هناك 2-4 المعلمات وقد يكون لها بعض القيم الافتراضية، فإنه لا يزال يبدو قليلا أكثر ملاءمة لالزائد، ولكن هذا قد يكون مسألة ذوق شخصي.

نصائح أخرى

هناك خيار آخر وهو الاختلاف في نمط المنشئ - لديك نوع يمثل جميع المعلمات، وقم بإنشاء مثيل من هذا النوع (الذي يتم تعيينه افتراضيًا وفقًا لذلك)، وقم بتعيين الخصائص التي تريدها، ثم قم بتمرير النتيجة إلى الطريقة الأصلية، أو قم بإضافة طريقة في "نوع المعلمة" لاستدعاء الطريقة لك.

يمكنك رؤية ذلك عمليًا في المكتبات القياسية باستخدام ملحق ProcessBuilder و Process الطبقات.

ونرى varargs

HTTP : //www.java-tips.org/java-se-tips/java.lang/using-the-varargs-language-feature.html

و(URL المحدثة، وأضاف هذا التعليق لستاكوفيرفلوو يتطلب> 30 حرف)

لجعل هذا أكثر بساطة، أنا خلقت تعليق توضيحي عن القيم الافتراضية وعلى معالج الشرح الذي يولد الفائقة مع أساليب طاقتها. على سبيل المثال:

protected void process(
    Processor processor,
    String item,
    @Default("Processor.Size.LARGE") Size size,
    @Default("red") String color,
    @Default("1") int quantity) {
        ...
}

والذي يولد (في الطبقة المتفوقة ولدت)

protected void process(sample.Processor processor, java.lang.String item)  {
    process(processor, item, Processor.Size.LARGE, "red", 1);
}
protected void process(sample.Processor processor, 
                       java.lang.String item, 
                       sample.Processor.Size size)  {
    process(processor, item, size, "red", 1);
}
protected void process(sample.Processor processor, 
                       java.lang.String item, 
                       sample.Processor.Size size, 
                       java.lang.String color)  {
    process(processor, item, size, color, 1);
}
protected abstract void process(sample.Processor processor, 
                                java.lang.String item, 
                                sample.Processor.Size size, 
                                java.lang.String color, 
                                int quantity) ;

http://code.google.com/p/javadude/wiki/ شروح - سكوت

ويمكن أن يكون من الصعب جدا في محاولة لترجمة عملية على الرغم بك من الناطقة واحد إلى آخر. يمكنك، كما أشار آخرون، والقيام ببعض احترف العمل لربما تحصل على ما تريد ... ولكن كلما كنت "قبول" الطريقة التي جافا تم تصميمه للعمل كلما كان ذلك أفضل حالا سوف يكون لكم عند العمل في جاوة.

ولقد كان للقيام ببعض PHP الاشياء ... إزعاج لي إلى ما لا نهاية لانني لم أستطع الحصول عليها أن تفعل ما أردت ... لذلك يذهب في كلا الاتجاهين.

وأكبر عقبة أنت ذاهب لتصل الى ومن المرجح الكتابة ثابتة. هناك أشياء يمكنك محاولة القيام كمحاولة للتغلب على ذلك، ولكن في النهاية أنها ستكون الإختراق كبير جدا.

في الأيام الأولى من C ++ حاول الناس إقناع C ++ على التصرف مثل من Smalltalk ... لم يعمل بشكل جيد جدا. في الأيام الأولى إذا حاول الناس جافا لاتخاذ معارفهم C ++ واستخدامه في جاوة ... لم يعمل بشكل جيد جدا (والذي هو محبط مضاعف كما لغات متشابهة جدا على السطح).

ونصيحتي لجافا الترميز تعلم برمجة مثل مطور جافا بدلا من مطور PHP.

لمشكلة الفورية الخاصة بك، وأنه من الممكن أنه يجب أن يكون حقا إعادة ضبطها الطبقات اختلاف من المصنع بدلا من خلق نفس النوع من الكائن مع مجموعة المتغيرات مختلفون؟

وطالما كنت رمز بطريقة OO أنك لن تفوت القيم الافتراضية في جاوة. الوسائط الافتراضية هي في متناول يدي فقط في أسلوب الترميز الإجرائي.

في OO بدلا من تمرير الدولة من خلال أساليب / الإجراءات، والدولة هي بالفعل في كائن استدعاء، أو الكائنات التي تمرر كمعلمات. أكثر من الوقت الذي تحتاجه لا يزيد عن 1 أو 2 المعلمات في أساليب الاتصال.

إذا كنت تريد تكوين كنت تعترض قبل استخدامه، وكنت بنائه مع منشئ بسيط، ومن استدعاء اضعي مختلفة. وهذا يجعل رمز أكثر من ذلك بكثير للقراءة (لأنك ترى أسماء اضع)، مقارنة مع استدعاء منشئ وجود العديد من الحجج. وفي حالة سمة جديدة تأتي في وقت لاحق، يمكنك إضافة إلى وجوه الخاص بك دون الحاجة إلى تعديل أساليب مصنع الموجودة لديك.

ونعم كتبها صافية في أعمالها الحمولة الزائدة التي هي الطريقة الوحيدة لاستخدام افتراضي مواضيعها في جافا. ولكن هنا الإختراق بالنسبة لك. إذا كنت تستخدم الحمولة الزائدة وكنت تريد أن يكون المعلمة الافتراضية. ثم سوف ينتهي

public void methodA(A arg1) { }
public void methodA( B arg2,) { }
public void methodA(C arg3) { }
public void methodA(A arg1, B arg2) { }
public void methodA(A arg1, C arg3) { }
public void methodA( B arg2, C arg3) { }
public void methodA(A arg1, B arg2, C arg3) { }

ولكن باستخدام varargs

public class DefaultValue
{
 public static void main(String[] args)
  {
       defaultParameter();
       defaultParameter(true);
  }

  public static void defaultParameter(Boolean …gender)
  {
       boolean genderBoolean = false; // It is the default value you want to give
       if(1 == gender.length)
       {
            genderBoolean = gender[0]; // Overrided Value
      }
       System.out.println(genderBoolean);
 }
}

وسيكون الناتج رمز أعلاه يكون

false
true

لأمثلة أكثر مشابهه وتفسير زيارة href="http://itfrustration.in/java-default-parameter-values/" جافا الافتراضية المعلمة القيم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top