@ScottF Voulez-vous comment utiliser les énumérations?
Anish B.12
Dans la réponse du haut, il y a une définition d'énumération. Je voudrais un exemple de la façon dont cette énumération définie serait utilisée dans le code. Par exemple, comment le ctor défini serait-il utilisé pour créer une instance d'énumération avec une valeur entière spécifique.
ScottF
@ScottF si j'étais vous, au lieu de mettre une prime sur ce poste, je préfère poster une toute nouvelle question ..... ou lire la documentation sur les énumérations. Il semble que vous ayez besoin de saisir quelques connaissances de base à ce sujet;)
lealceldeiro
enum ids {OPEN = 100, CLOSE};?
M. Oscar
Réponses:
307
Les énumérations Java ne sont pas comme les énumérations C ou C ++, qui ne sont en réalité que des étiquettes d'entiers.
Les énumérations Java sont implémentées plus comme des classes - et elles peuvent même avoir plusieurs attributs.
La grande différence est qu'ils sont de type sûr ce qui signifie que vous n'avez pas à vous soucier de l'attribution d'une énumération COLOR à une variable SIZE.
En fonction de votre déclaration, la meilleure pratique en utilisant java pour créer une énumération d'entiers séquentiels (similaire à une énumération C ++), pour un index dans un tableau ou quelque chose, consisterait à écrire: enum Ids {NAME (0), AGE (1 ), HAUTEUR (2), POIDS (3); } Merci, -bn
bn.
Peut-être, et surtout si vous sérialisez jamais les valeurs intégrales quelque part.
lavinio
1
pouvez-vous expliquer comment utiliser cette énumération dans une fonction?
Bugs Happen
2
Il est paresseux des normes Java de ne pas permettre de définir une valeur pour une énumération. Au moins, c # permet que AND soit protégé par type.
csmith
2
FWIW, C ++ 11 a désormais un type sécurisé enum class.
phoenix
92
Oui. Vous pouvez passer les valeurs numériques au constructeur de l'énumération, comme ceci:
Cool. Est-il possible de mixer? C'est-à-dire attribuer des numéros uniquement aux valeurs Enum choisies.
Frederick Nord
Le modificateur privé est redondant pour les constructeurs d'énumérations
Nino van Hooff
@FrederickNord - Bien sûr. Ajoutez simplement un deuxième constructeur privé sans argument qui s'initialise valueà un (disons) zéro. Incluez ensuite (par exemple) DANCEdans la liste des valeurs.
Notez que ces deux façons utilisent moins de mémoire et plus d'unités de processus. Je ne dis pas que c'est la meilleure façon mais c'est juste une autre approche.
Pourquoi est getColorValue()synchronisé dans le deuxième exemple?
josaphatv
@josaphatv Toutes les fonctionnalités du deuxième exemple sont statiques, elles ne changent jamais. Vous pouvez le faire HL_COLORS.getColorValue(HL_COLORS.YELLOW);sans initialiser l'énumération.
Mazunki
11
Si vous utilisez des types d'énumération très volumineux, les éléments suivants peuvent être utiles;
La fonction ordinal () renvoie la position relative de l'identifiant dans l'énumération. Vous pouvez l'utiliser pour obtenir une indexation automatique avec un décalage, comme avec une énumération de style C.
Edit: je viens de réaliser que cela est très similaire à la réponse de ggrandes , mais je vais le laisser ici car il est très propre et à peu près aussi proche que possible d'une énumération de style C.
Dans l'exemple, vous prenez une énumération et obtenez un int. Pouvez-vous montrer l'inverse, prendre un entier et vous retrouver avec une énumération (sans casse de commutateur explicite pour chaque valeur?)
ScottF
Selon la question, je pense que c'est la réponse la plus appropriée. Ici, nous avons changé l'index par défaut d'énumération à partir de 100 sans définir de nouvelle variable et les assigner via le constructeur.
Rahul Jain
@RahulJain Je préfère utiliser la réponse acceptée. Cela me semble plus propre.
lealceldeiro
1
@scottf
Une énumération est comme un singleton. La JVM crée l'instance.
Si vous le créiez vous-même avec des classes, cela pourrait ressembler à ça
publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}
Et pourrait être utilisé comme ça:
publicclassHelloWorld{publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}publicstaticvoid main(String[]args){System.out.println(MyEnum.ONE);System.out.println(MyEnum.TWO);System.out.println(MyEnum.ONE ==MyEnum.ONE);System.out.println("Hello World");}}
@scottf, vous avez probablement confondu à cause du constructeur défini dans l'ENUM.
Permettez-moi d'expliquer cela.
Lors du class loaderchargement de la enumclasse, le enumconstructeur est également appelé. Sur quoi!! Oui, c'est appelé OPENet close. Avec quelles valeurs 100pour OPENet 200pourclose
Mais c'est une mauvaise pratique. enumest utilisé pour représenter constantscomme days of week, colors in rainbowc'est -à- dire un petit groupe de constantes prédéfinies.
enum ids {OPEN = 100, CLOSE};
?Réponses:
Les énumérations Java ne sont pas comme les énumérations C ou C ++, qui ne sont en réalité que des étiquettes d'entiers.
Les énumérations Java sont implémentées plus comme des classes - et elles peuvent même avoir plusieurs attributs.
La grande différence est qu'ils sont de type sûr ce qui signifie que vous n'avez pas à vous soucier de l'attribution d'une énumération COLOR à une variable SIZE.
Voir http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html pour en savoir plus.
la source
enum class
.Oui. Vous pouvez passer les valeurs numériques au constructeur de l'énumération, comme ceci:
Reportez-vous au Guide du langage Sun Java pour plus d'informations.
la source
value
à un (disons) zéro. Incluez ensuite (par exemple)DANCE
dans la liste des valeurs.ce qu'il faut utiliser de cette façon:
il n'y a qu'une seule méthode ..
vous pouvez utiliser une méthode statique et passer l'Enum en tant que paramètre comme:
Notez que ces deux façons utilisent moins de mémoire et plus d'unités de processus. Je ne dis pas que c'est la meilleure façon mais c'est juste une autre approche.
la source
getColorValue()
synchronisé dans le deuxième exemple?HL_COLORS.getColorValue(HL_COLORS.YELLOW);
sans initialiser l'énumération.Si vous utilisez des types d'énumération très volumineux, les éléments suivants peuvent être utiles;
la source
Si vous souhaitez émuler l'énumération de C / C ++ (nombre de base et incréments suivants):
la source
La fonction ordinal () renvoie la position relative de l'identifiant dans l'énumération. Vous pouvez l'utiliser pour obtenir une indexation automatique avec un décalage, comme avec une énumération de style C.
Exemple:
Donne la sortie:
Edit: je viens de réaliser que cela est très similaire à la réponse de ggrandes , mais je vais le laisser ici car il est très propre et à peu près aussi proche que possible d'une énumération de style C.
la source
@scottf
Une énumération est comme un singleton. La JVM crée l'instance.
Si vous le créiez vous-même avec des classes, cela pourrait ressembler à ça
Et pourrait être utilisé comme ça:
la source
@scottf, vous avez probablement confondu à cause du constructeur défini dans l'ENUM.
Permettez-moi d'expliquer cela.
Lors du
class loader
chargement de laenum
classe, leenum
constructeur est également appelé. Sur quoi!! Oui, c'est appeléOPEN
etclose
. Avec quelles valeurs100
pourOPEN
et200
pourclose
Puis-je avoir une valeur différente?
Oui,
Mais c'est une mauvaise pratique.
enum
est utilisé pour représenterconstants
commedays of week
,colors in rainbow
c'est -à- dire un petit groupe de constantes prédéfinies.la source
Je pense que vous êtes confus de regarder les énumérateurs C ++. Les énumérateurs Java sont différents.
Ce serait le code si vous êtes habitué aux énumérations C / C ++:
la source