décembre
2005
A coté de toutes les nouveautées de Java 5.0, le type énuméré peut sembler un peu dérisoire, voir inutile… Il a pourtant un grand nombre d’atout dans sa poche…
Le type énuméré enum de Java 5.0 permet d’apporter une plus grande sécurité dans vos applications, puisque le compilateur peut ainsi vérifier la validité des valeurs à la compilation. Et cela apporte déjà une bonne raison de les préférer aux champs static final int habituellement utilisés…
Mais cela apporte également d’autres avantages…
- Une facilité de debuggage et de trace, puisque la méthode toString() de chaque type énuméré affichera par défaut son nom tel qu’il est inscrit dans le fichier source Java (on peut également utiliser directement la méthode name()).
- Cela permet également, lorsqu’on utilise un EDI, d’utiliser correctement l’auto-complétion des différentes valeurs (alors qu’avec un int, l’EDI ne peut pas distinguer les valeurs correctes de celles qui ne le sont pas).
- Enfin l’EDI peut générer automatiquement tous les choix possibles dans un switch, voir d’afficher un warning en cas d’oubli !
Sans oublier qu’une enum est un vrai objet, et peut donc comporter des attributs et des méthodes…
Je regretterais presque que Sun n’ait pas casser sa sacro-sainte rétro-compatibilité pour remplacer les champs static final int par des enums…
PS : Si vous utilisez toujours un JDK antérieur, il vous reste la solution indiqué dans la FAQ pour faire une énumération…
5 Commentaires + Ajouter un commentaire
Tutoriels
Discussions
- Définition exacte de @Override
- Difference de performances Unix/Windows d'un programme?
- Recuperation du nom des parametres
- Classes, méthodes private
- L'apparition du mot-clé const est-il prévu dans une version à venir du JDK?
- [ fuite ] memoire
- Possibilité d'accéder au type générique en runtime
- jre 1.5, tomcat 6.0 et multi processeurs
- [REFLEXION] Connaitre toutes les classes qui implémentent une interface
Oui ton illustration montre bien le problème que ça impliquerait. En fait, c’est pas vraiment de l’héritage dont on aurait besoin mais plutôt qu’une énumération puisse être basée sur une autre…
Je suis d’accord avec toi que si l’énumération évolue souvent, ce n’est plus une énumération ; l’exemple des couleurs n’est pas forcément le meilleur :o) … Mais tu peux avoir des évolutions mineures de celle-ci tout de même.
Un truc du style : Couleur (CouleurNB, ROUGE, BLEU, …) serait pas mal quand même :o)))
Toine
Oui je te comprend dans un sens…
Mais imagine que tu ais cette méthode :
<br />
switch (couleur) { <br />
case NOIR : <br />
System.out.println("Noir"); <br />
break; <br />
case BLANC : <br />
System.out.println("Blanc"); <br />
break; <br />
} <br />
<br />
}
Le code est correct puisque tu gères bien toutes les valeurs de l’énumération, et on ne peut utiliser la méthode qu’avec deux paramètre (si on ne compte pas null) :
setCouleur(CouleurNB.NOIR); <br />
// ou <br />
setCouleur(CouleurNB.BLANC); <br />
Maintenant si l’héritage était permis, rien ne t’empêcherais de faire :
setCouleur(Couleur.BLEU); <br />
// ou <br />
CouleurNB couleur = Couleur.BLEU; <br />
setCouleur(couleur); <br />
Et tu te retrouverais avec du code érronné puisque tu ne traite pas ce cas dans la méthode…
Plus globalement, si ton énumération doit évoluer c’est que ce n’est pas vraiment une enum, mais plutot une liste (ou un Set) d’objet…
Pour le lien c’est celui ci il me semblait l’avoir mis… je dois perdre la tête…
http://blog.developpez.com/index.php?blog=40&p=955&more=1&c=1&tb=1&pb=1
a++
Je parlais bien d’héritage…
Par exemple, si j’ai une énumération du style : CouleurNB (NOIR, BLANC)
Et je souhaite avoir une autre énumération basée sur celle-ci : Couleur (NOIR, BLANC, ROUGE, BLEU, …)
J’aurais aimé pouvoir écrire : Couleur extends CouleurNB (ROUGE, BLEU, …)
Comme ça, si un jour j’ajoute « GRIS » dans CouleurNB, je n’ai pas à modifé Couleur pour ajouter la même valeur…
Peux-tu me donner le lien vers le blog en question ?
Merci !
Toine
Que veux-tu dire par sous-classé ?
Si tu veux dire qu’une enum ne peut pas être hérité, cela vient du fait qu’une enum représente un ensemble fini de valeur, et si l’héritage est autorisé on se retrouve avec un ensemble infini de valeur (puisque chaque nouvelle ‘enum fille’ pourrait rajouter des valeurs…
On en a parlé il y a quelque temps sur le blog de Vincent…
a++
Une des choses que je trouve dommage (à moins que j’ai mal testé…) est qu’il n’est pas possible de sous-classé une énumération