8
votes

Quelle est l'utilisation de la création d'un énumé sans instance?

Je lisais et je mettais en œuvre des scénarios à travers l'énum. J'ai compris que nous pouvons créer un énum Sans exemple. Quelle est l'utilisation pratique d'un tel Enum ? Deuxièmement, Enum peut également implémenter Une interface, mais ne peut évidemment pas étendre une classe car elle étend déjà la classe Enum . Quels sont les avantages pratiques de la création d'un Enum sans instances? BEN


2 commentaires

Oh de cette manière. Mais de nombreux intervieweurs posent cette question. S'il n'y en a pas, pourquoi Java le permettrait-il de le permettre? Quelque part peut être utilisé, nous n'en sommes pas au courant.


Voir aussi: Stackoverflow.com/a/14900526/829571


3 Réponses :


11
votes

Membres Zero-Member est en fait un CLASSE UTILITY IDIOM utilisé par un certain segment de la communauté Java (notamment Peter Lawrey ). Ils sont les plus concis, et sans doute le moyen le plus propre de garantir que la classe ne peut pas être instanciée ou sous-classée.

Naturellement, vous n'aurez aucun instance dans une telle énorme; Seuls les statiques.


13 commentaires

Pouvez-vous donner un exemple d'où quelque chose comme ça est fait? Je peux penser à beaucoup d'où une classe normale est utilisée (par exemple java.lang.math ), mais je ne pense pas avoir jamais vu cela.


Mais il apparaît alors dans la section Enum du Javadoc, qui n'est pas nécessairement là que vous le chercheriez. Une classe finale (pour clarté) + constructeur privé est imo l'idiome standard pour un tel cas d'utilisation (bien qu'il soit fonctionnellement équivalent). C'est ce qui est typiquement fait dans le JDK (y compris 8).


@arshajii maths est beaucoup trop vieux pour être un Enum .


"Bien connu": Pouvez-vous fournir un exemple / référence pour valider cette réclamation? Je n'ai jamais vu un énumé utilisé de cette façon.


@damo je pourrais être biaisé, j'admets. J'ai lu Blog de Peter Lawrey Sur le sujet il y a longtemps il y a longtemps, alors cet idiome m'a grandi.


Je vais également admettre que, j'ai vu ce concept quelque part sur le blog qu'une énorme instance peut être utilisée comme classe d'utilité. Mais je veux toujours savoir quel genre de classe d'utilité. Pour une telle classe d'utilité n'est pas assez de classe statique normale. Pourquoi quelqu'un irait-il avec Enum dans ce cas?


@benz parce qu'il est plus concis, ce qui n'est pas du tout à peu près le nombre de caractères: juste en voyant le mot Enum Vous pouvez immédiatement être assuré que cette classe répond à toutes les exigences des classes utilitaires: pas de sous-classement, Aucune instanciation. Il s'agit de Charge mentale placée sur le programmeur. Lorsque chaque morceau de code de projet est béni avec une telle grâce, l'effet global est bien au-delà de subtil.


C'est correct, je suis d'accord avec votre concept à coup sûr. Sur la base la plus logique, il semble une solution parfaite.


Donc, Lawrey a montré deux façons d'abuser Enum :) Qui se soucie de quelqu'un sous-classes math ou instancie un objet maths. Il existe des classes utilitaires pouvant être sous-classées et insnitaisées et elles n'ont jamais causé de problème. Par exemple: haricots, modificateur, URLECODER . (mais pas urlencoder, lol)


Je me souviens quand j'ai suggéré d'utiliser Enums en tant que cours utilitaires, c'était tellement de haine ... Les gens changent-ils? Stackoverflow.com/Questtions/4520216/...


@kan Oui, les gens de nombreuses fois ne peuvent distinguer leurs croyances religieuses de la vérité objective. Il était une fois une fois, quelqu'un a probablement argumenté "Comment pouvez-vous faire une classe qui ne peut pas être instancié? Une classe est un modèle pour faire des objets et toute autre utilisation de celui-ci est un une odeur de la transaction et d'une odeur de code clair" . Eh bien, les temps ont changé pour ces personnes.


Marko: Une idée soignée sur l'énum, ​​et je suis content que j'en ai appris ici ici, donc je le reconnaîtrai au futur code. Mais je ne vois pas de "I> problème avec instanciation ou même sous-classement d'une classe qui est toute la statique, comme les mathématiques. Pouvez vous donner un exemple?


@ user949300 il n'y a pas de problème; Il s'agit de transporter des intentions.



2
votes

Enum sont des types de référence comme Classe ou interfaces . Cela signifie que vous pouvez Eh bien adapte le principe " Programme à l'interface et à la mise en œuvre" << / a>.


0 commentaires

0
votes

membres d'un Enum n'est pas nécessairement fixé avant la fin de l'univers. Vous pouvez ajouter de nouveaux membres sans briser la comparabilité binaire. Je peux donc imaginer qu'un Enum est créé pour modéliser un concept qui n'a aucun cas à l'heure actuelle, mais peut en avoir ajouté plus tard.

est-il également possible qu'un enum est créé pour un concept que nous savons définitivement aucun cas? Par exemple Enum negatvenaturalnumber {} ? Pourrait-il servir de but dans un programme? Qui sait, on ne peut pas dire avec certitude.


0 commentaires