60 votes

Dois-je ajouter une annotation @Override lorsque j'implémente des méthodes abstraites en Java ?

Lors de la substitution d'une méthode non virtuelle en Java, l'utilisation de la balise @Override est recommandée, mais que faire si j'implémente une méthode abstraite ? Dois-je utiliser @Override alors aussi ?

83voto

Andrzej Doyle Points 52541

J'ai tendance à préférer l'utilisation de @Override dans ce cas, afin que la méthode soit signalée dans les sous-classes si la super-classe change (soit en supprimant la méthode, soit en changeant sa signature, etc.)

La seule véritable différence est que sans l'annotation, si la méthode de la superclasse/interface est modifiée ou supprimée, l'implémentation en question devient simplement une méthode "normale" de cette classe. Vous devriez donc ajouter l'annotation si vous implémentez la méthode uniquement pour remplir le contrat ; et vous ne devriez probablement pas l'ajouter si la méthode a un sens dans votre classe indépendamment de toute interface implémentée ou méthode abstraite héritée.

4 votes

Vous devez également disposer de Java 6 pour tirer parti de cette annotation. Java 5 ne vous permet pas de la placer sur les implémentations d'interfaces.

23voto

Jon Skeet Points 692016

Oui - encore une fois, cela indique au compilateur : "Je veux vraiment surcharger une méthode ici. S'il y a n'est pas une méthode correspondante à contourner, j'ai fait une erreur et je veux qu'on me le dise !"

Personnellement, je trouve dommage que cela ne soit qu'une annotation plutôt que de faire partie du langage (comme c'est le cas en C#), mais c'est le bénéfice du recul, bien sûr.

1 votes

Ça a sauvé ma peau plusieurs fois.

18voto

mR_fr0g Points 3534

Oui. C'est la pratique recommandée par Joshua Bloch dans Effective Java.

8voto

Mark Ingram Points 663

En fait, Joshua Bloch, dans le dernier paragraphe de la page 178 dans Java efficace (2e édition) Selon l'avis de la Commission européenne, il n'est pas essentiel que les méthodes des classes concrètes qui surchargent les méthodes abstraites utilisent la méthode de l'utilisateur final. Override car le compilateur donnerait une erreur de toute façon. Cependant, "il n'est pas nuisible de le faire".

Je vous recommande de choisir une stratégie et de vous y tenir avec constance.

0 votes

Le compilateur donnerait une erreur de toute façon ? Vous voulez dire que si une classe concrète implémente une méthode qui n'est pas une méthode abstraite d'une superclasse, le compilateur s'en plaindrait ? Cela ne peut pas être ce que vous voulez dire, mais je n'arrive pas à comprendre ce que vous voulez dire.

1 votes

@LarsH Il veut dire que le compilateur donnera une erreur si la classe concrète ne parvient pas à implémenter une méthode abstraite de la superclasse, ce qui serait le cas si vous aviez mal orthographié le nom de la méthode abstraite que la sous-classe devait implémenter.

1 votes

@espertus : Merci pour cette précision. Vous n'obtiendriez donc pas d'erreur ou d'avertissement si, comme l'a dit Andrzej, la méthode de la superclasse/interface est modifiée ou supprimée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X