224 votes

Pourquoi un Enum implémente une Interface ?

Je viens de découvrir que Java permet aux énumérations d’implémenter une interface. Ce qui serait une affaire de bon usage pour cela ?

294voto

helpermethod Points 11015

Voici un exemple (un analogue/better un se trouve à Java efficace 2e édition) :

Maintenant, pour obtenir une liste des deux simples + opérateurs complexes :

Donc ici, vous utilisez une interface pour simuler des enums extensibles (ce qui ne serait pas possibles sans l’aide d’une interface).

152voto

Brian Agnew Points 143181

Les enums ne suffit représenter les ensembles passifs (p. ex. les couleurs). Ils peuvent représenter des objets plus complexes avec la fonctionnalité, et donc vous risquez alors de vouloir ajouter d’autres fonctionnalités à ces - par exemple vous pouvez avoir des interfaces telles que , etc. et composants prenant en charge ceux-ci.

25voto

Jorn Points 5202

Le exemple donné par plusieurs personnes ici ne va pas, depuis qui implémente déjà. Vous ne pouvez pas l’ignorer même.

Un meilleur exemple est d’avoir une interface qui définit, disons, un type de données. Vous pouvez avoir un enum implémente les types simples et ont des classes normales pour implémenter des types complexes :

13voto

Tansir1 Points 1049

Depuis les Énumérations peuvent implémenter des interfaces ils peuvent être utilisés pour la stricte application du pattern singleton. En essayant de faire une classe standard un singleton permet...

  • la possibilité d'utiliser des techniques de réflexion pour exposer les méthodes privées comme publiques
  • pour hériter de votre singleton et dominante de votre singleton méthodes avec quelque chose d'autre

Les énumérations comme des singletons aider à prévenir ces problèmes de sécurité. Cela aurait été l'un des contributeurs de raisons de laisser les Énumérations agir en tant que classes et d'implémenter des interfaces. Juste une supposition.

Voir http://stackoverflow.com/questions/427902/java-enum-singleton et http://stackoverflow.com/questions/2111768/singleton-class-in-java pour plus de discussion.

10voto

Chris Dennett Points 12396

Il est nécessaire pour l'extensibilité -- si quelqu'un utilise une API que vous avez développé, les énumérations, vous définissez sont statiques; ils ne peuvent pas être ajoutés ou modifiés. Toutefois, si vous le permettez implémenter une interface, la personne à l'aide de l'API peuvent développer leurs propres enum à l'aide de la même interface. Vous pouvez ensuite enregistrer cette enum avec un enum gestionnaire des conglomérats les énumérations avec l'interface standard.

Edit: @Méthode d'aide a l'exemple parfait de cela. Penser à avoir d'autres bibliothèques de définir de nouveaux opérateurs et ensuite à un gestionnaire de classe que "hey, c'enum existe-enregistrer'. Sinon, vous ne être en mesure de définir des Opérateurs dans votre propre code, il n'y aurait pas d'extensibilité.

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