En la respuesta superior, hay una definición de enumeración. Me gustaría un ejemplo de cómo se usaría esa enumeración definida en el código. Por ejemplo, cómo se usaría el ctor definido para crear una instancia de enumeración con un valor entero específico.
ScottF
@ScottF si fuera usted, en lugar de establecer una recompensa por esta publicación, preferiría publicar una pregunta completamente nueva ... o leer la documentación sobre las enumeraciones. Parece que necesita comprender algunos conocimientos básicos al respecto;)
lealceldeiro
enum ids {OPEN = 100, CLOSE};?
Sr. Oscar
Respuestas:
307
Las enumeraciones de Java no son como las enumeraciones de C o C ++, que en realidad son solo etiquetas para enteros.
Las enumeraciones Java se implementan más como clases, e incluso pueden tener múltiples atributos.
Según su enunciado, la mejor práctica usando java para crear una enumeración de enteros secuenciales (similar a una enumeración de C ++), para un índice en una matriz o algo, sería escribir: enum Ids {NAME (0), AGE (1 ), ALTURA (2), PESO (3); } Gracias, -bn
bn.
Posiblemente, y especialmente si alguna vez serializa los valores integrales en alguna parte.
lavinio
1
¿puedes decir cómo usar esta enumeración en una función?
errores ocurren el
2
Es un vago de los estándares de Java no permitir que se establezca un valor para una enumeración. Al menos c # permite que esto Y sea de tipo seguro.
csmith
2
FWIW, C ++ 11 ahora tiene un tipo seguro enum class.
Phoenix
92
Si. Puede pasar los valores numéricos al constructor para la enumeración, así:
Frio. ¿Es posible mezclar? Es decir, solo asigna números a los valores de Enum elegidos.
Frederick Nord el
modificador privado es redundante para constructores de enumeración
Nino van Hooff
@FrederickNord - Claro. Simplemente agregue un segundo constructor privado sin argumentos que se inicialice valuea un (digamos) cero. Luego incluya (digamos) DANCEen la lista de valores.
¿Por qué se getColorValue()sincroniza en el segundo ejemplo?
josaphatv
@josaphatv Toda la funcionalidad en el segundo ejemplo es estática, nunca cambia. Es posible que desee HL_COLORS.getColorValue(HL_COLORS.YELLOW);sin inicializar la enumeración.
mazunki
11
Si usa tipos de enumeración muy grandes, los siguientes pueden ser útiles;
La función ordinal () devuelve la posición relativa del identificador en la enumeración. Puede usar esto para obtener una indexación automática con un desplazamiento, como con una enumeración de estilo C.
Editar: acabo de darme cuenta de que esto es muy similar a la respuesta de ggrandes , pero lo dejaré aquí porque está muy limpio y lo más cerca posible de una enumeración de estilo C.
En el ejemplo, tomas una enumeración y obtienes un int. ¿Puede mostrar el reverso, tomar un int y terminar con una enumeración (sin un caso de cambio explícito para cada valor?)
ScottF
Según la pregunta, creo que esta es la respuesta más adecuada. Aquí hemos cambiado el índice predeterminado de enum para comenzar desde 100 sin definir una nueva variable y asignarla a través del constructor.
Rahul Jain
@RahulJain Prefiero usar la respuesta aceptada. Me parece más limpio.
lealceldeiro
1
@scottf
Una enumeración es como un Singleton. La JVM crea la instancia.
Si lo crearas tú mismo con clases, podría verse así
publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}
Y podría usarse así:
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, probablemente confundiste debido al constructor definido en ENUM.
Déjame explicarte eso.
Cuando class loadercarga la enumclase, el enumconstructor también llama. ¡¡En que!! Sí, se llama OPENy close. Con qué valores 100para OPENy 200paraclose
Pero, es una mala práctica. enumse usa para representar constantslike days of week, colors in rainbowes decir, un pequeño grupo de constantes predefinidas.
enum ids {OPEN = 100, CLOSE};
?Respuestas:
Las enumeraciones de Java no son como las enumeraciones de C o C ++, que en realidad son solo etiquetas para enteros.
Las enumeraciones Java se implementan más como clases, e incluso pueden tener múltiples atributos.
La gran diferencia es que son de tipo seguro, lo que significa que no tiene que preocuparse por asignar una enumeración COLOR a una variable SIZE.
Consulte http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html para obtener más información.
fuente
enum class
.Si. Puede pasar los valores numéricos al constructor para la enumeración, así:
Consulte la Guía del lenguaje Sun Java para obtener más información.
fuente
value
a un (digamos) cero. Luego incluya (digamos)DANCE
en la lista de valores.¿Qué hay de usar de esta manera:
solo hay un método ...
puede usar el método estático y pasar la enumeración como parámetro como:
Tenga en cuenta que estas dos formas usan menos memoria y más unidades de proceso. No digo que esta sea la mejor manera, pero es solo otro enfoque.
fuente
getColorValue()
sincroniza en el segundo ejemplo?HL_COLORS.getColorValue(HL_COLORS.YELLOW);
sin inicializar la enumeración.Si usa tipos de enumeración muy grandes, los siguientes pueden ser útiles;
fuente
Si desea emular una enumeración de C / C ++ (números base y nexts incrementales):
fuente
La función ordinal () devuelve la posición relativa del identificador en la enumeración. Puede usar esto para obtener una indexación automática con un desplazamiento, como con una enumeración de estilo C.
Ejemplo:
Da la salida:
Editar: acabo de darme cuenta de que esto es muy similar a la respuesta de ggrandes , pero lo dejaré aquí porque está muy limpio y lo más cerca posible de una enumeración de estilo C.
fuente
@scottf
Una enumeración es como un Singleton. La JVM crea la instancia.
Si lo crearas tú mismo con clases, podría verse así
Y podría usarse así:
fuente
@scottf, probablemente confundiste debido al constructor definido en ENUM.
Déjame explicarte eso.
Cuando
class loader
carga laenum
clase, elenum
constructor también llama. ¡¡En que!! Sí, se llamaOPEN
yclose
. Con qué valores100
paraOPEN
y200
paraclose
¿Puedo tener un valor diferente?
Si,
Pero, es una mala práctica.
enum
se usa para representarconstants
likedays of week
,colors in rainbow
es decir, un pequeño grupo de constantes predefinidas.fuente
Creo que estás confundido al mirar los enumeradores de C ++. Los enumeradores de Java son diferentes.
Este sería el código si está acostumbrado a enumeraciones de C / C ++:
fuente