Quel peut être le mauvais exemple d'héritage en Java?


Je connais les avantages de l'héritage en Java, mais il m'est un peu difficile d'accepter qu'il ait aussi des inconvénients. Quelqu'un peut-il me donner un mauvais exemple d'héritage en Java?

Author: Yasir Arsanukaev, 2011-03-20

5 answers

  • Stack extends Vector. Une pile n'est pas un vecteur.
  • Properties extends Hashtable. Un tableau de propriétés n'est pas une table de hachage.

Voir cette réponse pour un devis de Efficace Java.

Il était facile d'écrire l'implémentation Stack en utilisant ce qui est déjà implémenté dans Vector (de même pour Properties), mais cela a créé des problèmes - voir ici

 7
Author: Bozho, 2017-05-23 12:15:57

Un exemple est l'ancien modèle d'implémentation des interfaces constantes (une interface contenant uniquement des champs immuables), alors les classes souhaitant utiliser ces constantes implémenteraient cette interface pour plus de commodité. Le problème est que votre classe hérite maintenant de l'API de cette interface et que les extensions de sa conception peuvent nuire à votre API à l'avenir.

L'utilisation d'interfaces constantes de cette manière est généralement considérée comme un anti-modèle de nos jours. Depuis Java 5, vous pouvez utiliser énumèreau lieu d'interfaces pleines de constantes et imports statiques au lieu de définir des interfaces constantes.

À Partir de Efficace Java par Josh Bloch:

Le modèle d'interface constant est une mauvaise utilisation des interfaces. Qu'une classe utilise certaines constantes en interne est un détail d'implémentation. L'implémentation d'une interface constante provoque une fuite de ces détails d'implémentation dans l'API exportée de la classe.

 5
Author: krock, 2011-03-20 13:12:26

Il y a un très bon article ici parlant de l'utilisation de l'héritage par rapport à la composition en Java, y compris des exemples de quand et pourquoi utiliser l'un plutôt que l'autre. Il y a aussi une interview ici qui a discuté du sujet (faisant référence à l'édit Gang of Four pour "favoriser la composition sur l'héritage").

C'est un sujet très large et, du moins pour moi, très intéressant en fait. Beaucoup de programmeurs débutants obtiennent un héritage et commencent dans un mauvais chemin de conception, n'apprenant pas toujours comment fonctionne le polymorphisme et quels modèles et techniques de conception ils peuvent tirer parti pour écrire de meilleurs logiciels. Si vous êtes un programmeur orienté objet, vous ne pouvez jamais trop en apprendre sur le polymorphisme, les interfaces, l'héritage, la composition, les abstractions, etc.

 4
Author: David, 2011-03-20 12:42:26

Je crois que tant qu'il suit la ligne directrice "is-a" et que la personne qui l'implémente la comprend et ne la gâche pas, il n'y a pas vraiment d'inconvénients.

 1
Author: Barnesy, 2011-03-20 12:40:25

Immaturité est l'incapacité d'utiliser son intelligence sans le l'orientation de l'autre. Emmanuel Kant

Si vous dites: "Il est difficile pour vous d'accepter, qu'il a des inconvénients aussi.", alors je le comprends comme - Vous connaissez les inconvénients et vous avez des conflits moraux ou la confusion des idées, qui remettent en question votre nature de connaissances. Même manière que pour "entendre" et "écouter" sont deux choses différentes, je ne peux pas vous le faire comprendre, si vous n'essayez pas vous-même.

Si vous voulez comprendre, essayez de lire un livre, par exemple:

  • Java efficace (article 16): favoriser la composition sur l'héritage ( Lien )
 1
Author: Margus, 2011-03-20 13:02:28