هل يجب الإعلان عن الأساليب في واجهة Java باستخدام معدّل الوصول العام أو بدونه؟

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

سؤال

هل يجب الإعلان عن الأساليب في واجهة Java باستخدام أو بدون public الوصول الى المعدل؟

من الناحية الفنية لا يهم، بطبيعة الحال.طريقة الفصل التي تنفذ interface دائما public.ولكن ما هي الاتفاقية الأفضل؟

جافا نفسها ليست متسقة في هذا.انظر على سبيل المثال Collection ضد. Comparable, ، أو Future ضد. ScriptEngine.

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

المحلول

JLS يجعل هذا واضحا:

<اقتباس فقرة>   

ويجوز، ولكن بالإحباط كمسألة من نمط، لتحديد بوفرة في public و / أو معدل abstract لطريقة أعلن في واجهة.

نصائح أخرى

وينبغي حذف والتعديل العام في واجهات جافا (في رأيي).

ومنذ فإنه لا يضيف أي معلومات إضافية، توجه فقط الانتباه بعيدا عن الاشياء الهامة.

سوف

ومعظم نمط أدلة ننصح ترك ذلك، ولكن بطبيعة الحال، والشيء الأكثر أهمية هو أن تكون متسقة عبر مصدر برنامج الخاص بك، وخاصة لكل واجهة. المثال التالي يمكن بسهولة الخلط بين شخص ما، وهو ليس 100٪ يجيد جافا:

public interface Foo{
  public void MakeFoo();
  void PerformBar();
}

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

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

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

وثالثا، لم يكن لديك واجهة أي تطبيق البيانات بما في ذلك المتغيرات المثال والأساليب. إذا كان هناك سبب منطقي لادخال أساليب تنفيذها أو متغيرات سبيل المثال في واجهة ثم يجب أن تكون الفائقة في التسلسل الهرمي الميراث وليس واجهة. وبالنظر إلى هذه الحقيقة، لأنه لا طريقة يمكن تنفيذها في واجهة بالتالي كل الطرق في واجهة يجب أن تكون مجردة.

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

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

ومع الأخذ private، static، معدلات default لأساليب واجهة في جافا 09/08، الأمور أكثر تعقيدا وأنا أميل إلى الاعتقاد بأن الإعلانات الكاملة هي أكثر قابلية للقراءة (يحتاج جافا 9 إلى تجميع):

public interface MyInterface {

    //minimal
    int CONST00 = 0;
    void method00();
    static void method01() {}
    default void method02() {}
    private static void method03() {}
    private void method04() {}

    //full
    public static final int CONST10 = 0;
    public abstract void method10();
    public static void method11() {}
    public default void method12() {}
    private static void method13() {}
    private void method14() {}

}

وأود أن تجنب وضع المعدلات التي يتم تطبيقها بشكل افتراضي. كما أشار، يمكن أن يؤدي إلى التضارب والارتباك.

وأسوأ رأيت هو واجهة مع أساليب أعلن abstract ...

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

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

وأنا دائما أكتب ما أود أن استخدام إذا كان هناك أي واجهة وكنت أكتب التنفيذ المباشر، أي، وأود أن استخدام public.

وأنا أفضل تخطي ذلك، وأنا قرأت في مكان ما أن الواجهات بشكل افتراضي، public وabstract.

لدهشتي الكتاب - رئيس التصميم الأولى ، تستخدم public مع إعلان واجهة واجهة وسائل ... الذي جعلني إعادة التفكير مرة أخرى وهبطت بي الأمر على هذه الوظيفة.

وعلى أي حال، أعتقد يجب أن يتم تجاهل المعلومات الزائدة عن الحاجة.

أنا لا أتفق مع الإجابة الشائعة، وهي أن وجود الجمهور يعني أن هناك خيارات أخرى وبالتالي لا ينبغي أن تكون موجودة.الحقيقة هي أنه الآن مع Java 9 وما بعده هناك خيارات أخرى.

أعتقد بدلاً من ذلك أن Java يجب أن تفرض/تطلب تحديد "عام".لماذا؟لأن غياب المُعدِّل يعني الوصول إلى "الحزمة" في أي مكان آخر، ووجود هذا كحالة خاصة هو ما يؤدي إلى الارتباك.إذا قمت ببساطة بإجراء خطأ في الترجمة برسالة واضحة (على سبيل المثال."الوصول إلى الحزمة غير مسموح به في الواجهة.") سوف نتخلص من الغموض الواضح الذي يقدمه وجود خيار استبعاد "العامة".

لاحظ الصياغة الحالية في: https://docs.Oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4

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

انظر أن "الخاص" مسموح به الآن.أعتقد أنه كان يجب إزالة الجملة الأخيرة من JLS.من المؤسف أنه تم السماح بالسلوك "العام ضمنيًا" على الإطلاق لأنه من المحتمل أن يظل الآن متوافقًا مع الإصدارات السابقة ويؤدي إلى الارتباك بأن غياب معدّل الوصول يعني "عام" في الواجهات و"الحزمة" في مكان آخر.

والسبب في الأساليب في واجهات يجري من قبل الجمهور الافتراضي ومجردة يبدو منطقيا جدا واضحا لي.

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

وإضافة تلك المعدلات في التعليمات البرمجية غير زائدة عن الحاجة وغير مجدية ويمكن أن يؤدي إلا إلى استنتاج مفاده أن كنت يفتقرون إلى المعرفة و / أو فهم أساسيات جافا.

انها ذاتية تماما.أنا أحذف الزائدة public المعدل كما يبدو مثل الفوضى.وكما ذكر آخرون - الاتساق هو مفتاح هذا القرار.

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

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

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