سؤال

هل يجب إضافة تعليقات توضيحية إلى الطريقة التي تنفذ طريقة الواجهة @Override?

ال جافادوك من Override حاشية. ملاحظة يقول:

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

لا أعتقد أن الواجهة هي فئة فائقة من الناحية الفنية.أو هو؟

صياغة السؤال

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

المحلول

يجب عليك استخدامOverride كلما أمكن ذلك.ويمنع ارتكاب الأخطاء البسيطة.مثال:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

لا يتم تجميع هذا لأنه لا يتم تجاوزه بشكل صحيح public boolean equals(Object obj).

وينطبق الشيء نفسه على الأساليب التي تنفذ واجهة (1.6 فما فوق فقط) أو تجاوز طريقة الطبقة الفائقة.

نصائح أخرى

وأعتقد أن سلوك javac قد تغير - 1.5 أنه يحظر على الشرح، مع 1.6 لا. يوفر هذا الشرح الاختيار وقت التحويل البرمجي إضافية، لذلك إذا كنت تستخدم 1.6 كنت اذهب لذلك.

ويجب تعليم دائما طرق مع @Override إذا كان متوفرا.

في JDK 5 هذا يعني طرق الغالبة من superclasses، في JDK 6 و 7 يعني طرق الغالبة من superclasses، وطرق تنفيذ واجهات. والسبب، كما ذكر سابقا، هو أنه يسمح للمترجم للقبض على الأخطاء التي كنت تعتقد انك تجاوز (أو تطبيق) وسيلة، ولكن في الواقع تحديد طريقة جديدة (توقيع مختلف).

ووequals(Object) مقابل المثال equals(YourObject) هي حالة قياسية في النقطة، ولكن يمكن إجراء نفس الحجة لتطبيقات الواجهة.

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

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

ومع ذلك، كنا نفضل أن نرى الشرح مختلفة لهذا الاستخدام، وربما تعليق توضيحي @Implements.

وJDK 5.0 لا يسمح لك لاستخدام @Override الشرح إذا كنت تنفيذ طريقة أعلن في واجهة (خطأ الترجمة)، ولكن JDK 6.0 يسمح بذلك. لذلك قد يكون يمكنك تكوين تفضيل المشروع وفقا لمتطلبات الخاص بك.

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

وانها ليست مشكلة مع JDK. في الكسوف هيليوس، فإنه يسمح الشرحOverride لأساليب واجهة تنفيذها، أيهما JDK 5 أو 6. أما بالنسبة للكسوف غاليليو، لا يسمح هذا الشرحOverride، أيهما JDK 5 أو 6.

اذا كان أسمنت الطبقة ليست كذلك تجاوز طريقة مجردة باستخدام @Override ل تطبيق إنها مسألة مفتوحة لأن المترجم سوف يحذرك دائمًا من أي طرق غير منفذة.في هذه الحالات، يمكن تقديم حجة مفادها أنها تنتقص من سهولة القراءة - فهي تحتوي على المزيد من الأشياء التي يجب قراءتها في التعليمات البرمجية الخاصة بك، وبدرجة أقل، يطلق عليها اسم @Override و لا @Implement.

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

والكسوف نفسها سيضيف الشرح @Override عندما كنت اقول لها "توليد أساليب لم تنفذ" خلال خلق فئة التي تطبق واجهة.

والمشكلة مع بما في ذلك @Override هو أنه يجعلك تعتقد أنك نسيت أن استدعاء الأسلوب super.theOverridenMethod()، وهو <م> مربكة جدا . هذا ينبغي أن يكون واضحة تماما. ربما يجب أن جافا نقدم @Interface لاستخدامها هنا. حسنا، ولكن هالفاسيد خصوصية أخرى جافا ...

في جافا 6 والإصدارات الأحدث، يمكنك استخدام @Override لطريقة تنفيذ واجهة.

ولكن، أنا متأكدا أعتقد أنه من المنطقي: تجاوز يعني أنك هافا أسلوب في فئة السوبر، وكنت تنفيذها في فئة فرعية.

إذا كنت تنفيذ واجهة، وأعتقد أننا يجب أن تستخدم @Implement أو أي شيء آخر، ولكن ليس @Override.

من خلال قراءة javadoc في Java8، يمكنك العثور على ما يلي في إعلان تجاوز الواجهة:

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

  • تقوم الطريقة بتجاوز أو تنفيذ الطريقة المعلنة في النوع الفائق.
  • تحتوي الطريقة على توقيع يكافئ توقيع أي طريقة عامة تم الإعلان عنها في {@linkplain Object}.

لذلك، على الأقل في Java8، يجب عليك استخدامOverride عند تنفيذ طريقة الواجهة.

لواجهة، وذلك باستخدامOverride تسبب تجميع الخطأ. لذلك، كان لي لإزالته.

ذهب

ورسالة خطأ "The method getAllProducts() of type InMemoryProductRepository must override a superclass method".

وكما يلي: "One quick fix available: Remove @Override annotation."

وكان على الكسوف 4.6.3، JDK 1.8.0_144.

إذا الفئة التي تنفذ interface هي فئة abstract، @Override هو مفيد للتأكد من أن التنفيذ لطريقة interface. دون @Override فئة abstract أن مجرد تجميع ما يرام حتى لو لم يكن توقيع الأسلوب تنفيذ تطابق طريقة أعلن في interface. ستبقى طريقة interface متطابقة دون تنفيذ كما. وثيقة جافا التي استشهد بهاZhao

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

وهذه الطريقة لا تجاوز أو تنفيذ أسلوب أعلن في supertype

ويشير بوضوح إلى abstract الطبقة السوبر. وinterface لا يمكن أن يطلق عليه supertype. لذا، @Override لا لزوم لها، وليس من المعقول لتطبيقات أسلوب interface في فصول محددة.

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