Devrions-nous @Override l'implémentation d'une méthode d'interface?
-
03-07-2019 - |
Question
Une méthode qui implémente une méthode d'interface doit-elle être annotée avec @Override
?
Le javadoc du Remplacer
annotation dit:
Indique qu'une déclaration de méthode est destinée à remplacer une déclaration de méthode dans une superclasse. Si une méthode est annotée avec ce type d'annotation mais ne remplace pas une méthode de superclasse, les compilateurs sont tenus de générer un message d'erreur.
Je ne pense pas qu'une interface est techniquement une super-classe. Ou est-ce?
La solution
Vous devez utiliser @Override autant que possible. Cela évite les erreurs simples. Exemple:
class C {
@Override
public boolean equals(SomeClass obj){
// code ...
}
}
Cela ne compile pas car il ne remplace pas correctement public booléen est égal à (Object obj)
.
Il en va de même pour les méthodes qui implémentent une interface ( 1.6 et versions supérieures uniquement ) ou qui remplacent la méthode d'une classe Super.
Autres conseils
Je pense que le comportement de javac a changé: avec 1.5, il interdisait l'annotation, avec 1.6, ce n'était pas le cas. L'annotation fournit une vérification supplémentaire au moment de la compilation, donc si vous utilisez la version 1.6, je l'essaierai.
Vous devriez toujours annoter les méthodes avec @Override
si elles sont disponibles.
Dans JDK 5, cela signifie les méthodes de substitution des superclasses, tandis que dans les JDK 6 et 7, cela signifie des méthodes de substitution des superclasses et la mise en œuvre de méthodes d’interface. La raison, comme mentionné précédemment, est que cela permet au compilateur d'attraper les erreurs lorsque vous pensez que vous substituez (ou implémentez) une méthode, mais définissez en réalité une nouvelle méthode (signature différente).
L'exemple égal à (Object)
par rapport à égal à (YourObject)
est un exemple typique, mais le même argument peut être avancé pour les implémentations d'interface.
J'imagine que la raison pour laquelle il n'est pas obligatoire d'annoter les méthodes d'implémentation des interfaces est que JDK 5 l'a signalé comme une erreur de compilation. Si JDK 6 rend cette annotation obligatoire, la compatibilité avec les versions antérieures sera rompue.
Je ne suis pas un utilisateur Eclipse, mais dans d'autres IDE (IntelliJ), l'annotation @Override
est ajoutée uniquement lors de l'implémentation de méthodes d'interface si le projet est défini en tant que projet JDK 6+. J'imagine qu'Eclipse est similaire.
Cependant, j'aurais préféré voir une annotation différente pour cet usage, peut-être une annotation @Implements
.
Je l’utiliserais à chaque occasion. Voir Quand utilisez-vous l'annotation @Override de Java et pourquoi?
JDK 5.0 ne vous permet pas d'utiliser l'annotation @Override
si vous implémentez une méthode déclarée dans l'interface (son erreur de compilation), mais JDK 6.0 le permet. Ainsi, vous pourrez peut-être configurer vos préférences de projet en fonction de vos besoins.
Remplacer vos propres méthodes héritées de vos propres classes ne sera généralement pas interrompu lors de la refactorisation à l'aide d'un ide. Mais si vous substituez une méthode héritée d'une bibliothèque, il est recommandé de l'utiliser. Sinon, vous n'obtiendrez souvent aucune erreur lors d'un changement de bibliothèque ultérieur, mais un bogue bien caché.
Ce n'est pas un problème avec JDK. Dans Eclipse Helios, il permet l’annotation @Override pour les méthodes d’interface implémentées, quel que soit le kit JDK 5 ou 6. Pour Eclipse Galileo, l’annotation @Override n’est pas autorisée, quel que soit le kit JDK 5 ou 6.
Si une classe béton n'est pas substituant une méthode abstraite, l'utilisation de @Override
pour l'implémentation est une méthode ouverte. le compilateur vous avertira invariablement de toute méthode non implémentée. Dans ces cas, on peut argumenter que cela nuit à la lisibilité: il s'agit de choses à lire sur votre code et, dans une moindre mesure, il s'appelle @Override
et non @. Implémenter
.
Pour moi, c'est souvent la seule raison pour laquelle un code nécessite la compilation de Java 6. Pas sûr que ça en vaille la peine.
Eclipse lui-même ajoutera l'annotation @Override
lorsque vous lui direz de "générer des méthodes non implémentées". lors de la création d'une classe qui implémente une interface.
Le problème avec l'inclusion de @Override
est que cela vous fait penser que vous avez oublié d'appeler la méthode super.theOverridenMethod ()
, ce qui est très déroutant. . Cela devrait être limpide. Peut-être que Java devrait proposer un @Interface
à utiliser ici. Eh bien, encore une autre particularité de Java à moitié nulle ...
Dans java 6 et les versions ultérieures, vous pouvez utiliser @Override
pour une méthode mettant en oeuvre une interface.
Mais, je ne pense pas que cela ait du sens: override signifie que vous avez une méthode dans la super-classe et que vous l'implémentez dans la sous-classe.
Si vous implémentez une interface, je pense que nous devrions utiliser @Implement
ou quelque chose d'autre, mais pas le @Override
.
En lisant le javadoc dans java8, vous pouvez trouver ce qui suit dans la déclaration d’interface Remplacer:
Si une méthode est annotée avec cette annotation, les compilateurs doivent générer un message d'erreur, sauf si l'une au moins des conditions suivantes est remplie:
- La méthode remplace ou implémente une méthode déclarée dans un supertype.
- La méthode a une signature qui est équivalente à celle d'une méthode publique déclarée dans {@linkplain Object}.
Donc, au moins en java8, vous devez utiliser @Override sur une implémentation d'une méthode d'interface.
Pour l'interface, l'utilisation de @Override a provoqué une erreur de compilation. Donc, je devais l'enlever.
Message d'erreur renvoyé " La méthode getAllProducts () de type InMemoryProductRepository doit remplacer une méthode de superclasse
".
Il lit également " une solution rapide disponible: supprimez l'annotation @Override.
"
C'était sur Eclipse 4.6.3, JDK 1.8.0_144.
Si la classe qui implémente l'interface
est une classe abstraite
, @Override
est utile pour garantir que l'implémentation concerne un élément < méthode code> interface ; sans le @Override
, une classe abstract
serait simplement compilée correctement même si la signature de la méthode d'implémentation ne correspond pas à la méthode déclarée dans interface
; la méthode interface
incompatible devrait rester non implémentée.
Le document Java cité par @Zhao
La méthode remplace ou implémente une méthode déclarée dans un supertype
fait clairement référence à une super classe abstract
; un interface
ne peut pas être appelé le supertype.
Ainsi, @Override
est redondant et peu judicieux pour les implémentations de méthodes interface
dans des classes concrètes.