2014-04-21 3 views
4

Je sais que dans Java est la balise @Override pour annoter la méthode qui substitue la méthode de la superclasse, sinon il y a un avertissement. Ma question: existe-t-il une balise opposée pour annoter la méthode que nous ne voulons pas remplacer la méthode de la superclasse (par exemple par accident)?Balise opposée à @Override dans Java

Je sais que je peux définir la méthode dans la superclasse final, mais cette solution implique des changements dans le code de la superclasse. C'est ce que je ne veux pas faire - je veux juste changer mon code :)

Je sais que je peux définir un autre nom pour cette méthode, mais parfois en super classe il y a beaucoup de méthodes et vous ne savez pas d'eux. Ainsi, lorsque vous implémentez votre propre sous-classe, vous pouvez par accident utiliser le même nom. Comment éviter cela?

+5

Je ne pense pas. –

Répondre

5

Non, il n'y a pas prédéfini L'annotation Java est l'inverse de @Override. Cela dit, la plupart des EDI devraient être capables d'identifier si une méthode est en train de surcharger une autre. Par exemple, Eclipse a cette fonctionnalité. Si vous regardez votre classe dans la vue Structure, vous verrez un petit triangle où les remplacements se produisent. Par exemple:

enter image description here

Je dois croire que NetBeans et IntelliJ Idea doivent avoir des fonctionnalités similaires.


En aparté, ce problème que vous essayez de résoudre, celui d'éviter remplaçant par inadvertance une méthode mère, est grave et pernicieux, celui qui a un risque particulièrement élevé lors de l'extension des classes qui ont beaucoup méthodes ou une grande hiérarchie d'héritage (pensez à des composants Swing par exemple - j'ai eu un bug d'interface graphique frustrant en raison de mon trébuchement sur le fait de surcharger accidentellement les méthodes getX() et getY() de JPanel). C'est une autre raison de préférer en général la composition à l'héritage si la composition a un sens dans la situation.

+1

Cependant, vous pouvez construire quelque chose comme ça en utilisant JSR-308 (annotations de type) et le framework Checkers. Voir: http://types.cs.washington.edu/checker-framework/ –

+1

@BrianGoetz: Si vous pouvez montrer comment faire cela, comment créer spécifiquement une annotation qui permettra au compilateur de vous avertir des remplacements inattendus, s'il vous plaît Postez ceci comme une réponse. –

+5

Même problème ici! J'ai accidentellement outrepassé la méthode 'getHeight' et' getWidth' et j'ai passé plus d'une heure à déboguer en me demandant pourquoi cela ne fonctionnait pas! :) – bartektartanus

0

Attribuez à la méthode de la sous-classe un nom ou une signature différent de la méthode de la superclasse que vous ne souhaitez pas remplacer.

+4

Je sais que je peux définir un autre nom pour cette méthode, mais parfois, en super classe, il y a beaucoup de méthodes et vous ne les connaissez tout simplement pas.Ainsi, lorsque vous implémentez votre propre sous-classe, vous pouvez par accident utiliser le même nom. Comment éviter cela? [J'ai aussi ajouté ceci à la question] – bartektartanus

1

J'ai reçu cet avertissement dans NetBeans même si je ne remplaçais pas la méthode. J'appelais juste une méthode de sous-classe à partir du constructeur de la sous-classe et NetBeans marquait cela comme un override.

Même s'il n'y a pas de balise @override inverse, une solution simple est de rendre la méthode privée au lieu de publique/protégée si vous savez que vous ne la surchargerez pas ou ne l'utiliserez pas sous la sous-classe.

+3

Cela fonctionne à moins que la classe parente ait été écrite par quelqu'un d'autre et je n'ai pas accès ou je ne veux pas éditer ce code. :) – bartektartanus

+0

Lorsque vous étendez la classe de quelqu'un d'autre dans un package différent, voici la réponse. Si vous déclarez une méthode sans public ou protected, vous obtiendrez une erreur indiquant que vous ne pouvez pas réduire la visibilité de la méthode du super. Vous n'avez pas besoin de changer le code du super. –