Tipos de enumeración de Java
Cuando estaba discutiendo con mis colegas recientemente, de repente mencioné por qué el tipo de enumeración Moon no se usa para definir valores constantes en Java, pero los tipos estáticos finales públicos sí. utilizado para definirlos. En el pasado, lo definimos de esta manera y rara vez usamos definiciones de enumeración, por lo que no le prestamos mucha atención. Ante la repentina pregunta, realmente no sabemos por qué existe tal definición. Como no lo entiendes, tómate un tiempo para estudiarlo.
El tipo de enumeración en Java se define mediante la palabra clave enum. Todos los tipos de enumeración heredan del tipo Enum. El tipo Enum es solo un tipo nuevo en jdk1.5. Para comprender los tipos de enumeración, le recomiendo que abra la clase enum en jdk y la lea brevemente. Hay muchos métodos protegidos definidos en esta clase, como los constructores. Si queremos utilizar estos métodos, podemos definir el tipo de enumeración en la clase actual. Cada tipo de enumeración tiene su propio nombre y orden. Cuando generamos un tipo de enumeración, ingresamos el nombre del tipo de enumeración. Consulte los siguientes ejemplos para obtener más detalles.
1. El método habitual para definir constantes
Normalmente utilizamos el método estático final público para definir el código, como se muestra a continuación: 1 representa la luz roja, 3 representa la luz verde. , y 2 representa la luz amarilla.
Paquete com.csdn.myenum;
Luz de clase pública {
/*Luz roja*/
pública final estática int RED = 1;
/*Luz verde*/
public final static int VERDE = 3;
/*Luz amarilla*/
public final static int YELLOW = 2;
}
En segundo lugar, el tipo de enumeración define métodos constantes
El método de definición simple del tipo de enumeración es el siguiente . Parece que no podemos definir el valor de cada tipo de enumeración. Por ejemplo, podemos definir los códigos de luces rojas, verdes y amarillas de la siguiente manera:
Luces de enumeración pública {
Rojo, verde, amarillo;
}
Solo podemos mostrar luces rojas, verdes y amarillas, pero no podemos mostrar valores específicos. No se preocupe, dado que el tipo de enumeración proporciona un constructor, podemos hacerlo a través del constructor y anulando el método toString. Primero agregue el constructor al tipo de enumeración Light y luego pase el valor de cada tipo de enumeración a los parámetros correspondientes a través del constructor, mientras anula el método toString, que devuelve los parámetros pasados desde el constructor. El código reformado es el siguiente:
Luz de enumeración pública {
//Utilice el constructor para pasar parámetros
Rojo (1), verde (3), amarillo (2);
//Definir variables privadas
private int nCode
//Constructor, los tipos de enumeración solo pueden ser privados.
Luz especializada (int_nCode) {
Este. nCode = _ nCode
}
@override
cadena pública toString() {
Valor de retorno de (this.
nCode);
}
}
Tercero, código de muestra completo
El código de demostración completo del tipo de enumeración es el siguiente:
Paquete com.csdn.myenum;
Importar mapa Java.util.enum;
Importar conjunto Java.util.enum;
Prueba ligera de clase pública{
// 1. Definir el tipo de enumeración
Luz de enumeración pública{
//Usar constructor para pasar parámetros
Rojo (1), verde (3), amarillo (2);
//Definir variables privadas
private int nCode
//Funciones de construcción , los tipos de enumeración solo pueden ser privados.
Luz especializada (int_nCode) {
Este. nCode = _ nCode
}
@override
cadena pública toString() {
Valor de retorno de (this. nCode. );
}
}
/**
* @param args
*/< / p>
Public static void main(String[]args){
// 1. Recorre el tipo de enumeración
System. salir. println ("Demuestra el recorrido de tipos de enumeración...");
testTraversalEnum();
// 2. Demuestra el uso de objetos EnumMap.
Sistema. salir. println ("Demostrar el uso y recorrido de objetos EnmuMap...");
testEnumMap()
// 3. Demostrar cómo utilizar EnmuSet
<; p>sistema. salir. println ("Demostrar el uso y recorrido de objetos EnmuSet...");testEnumSet()
}
/**
;* Demuestra el recorrido de tipos de enumeración.
*/
TestTraversalEnum() vacío estático privado {
luz【】toda luz = valores de luz();
Para. (Luz encendida: Totalmente iluminada) {
Sistema. salir. println("Nombre de la luz actual: " align . name());
System. salir. println("Ordinal de luz actual: " light . ordinal());
System. salir. println ("Luz actual: " encendida");
}
}
/**
* Demuestra el uso de EnumMap , es similar al uso de HashMap, excepto que las claves son tipos de enumeración
*/
Private static void testEnumMap(){
// 1 Demostración. Definición del objeto EnumMap. El constructor del objeto EnumMap necesita pasar parámetros y el valor predeterminado es el tipo de clase de clave.
EnumMap lt light, string gtcurrEnumMap = new EnumMap lt light, string. gt (
Light. class);
mapa actual put(Light. red, "luz roja");
mapa actual put(Light.
Verde, "luz verde");
mapa actual puesto (Luz. amarilla, "luz amarilla"
// 2. Atravesar objetos
); for (Luz Luz: Luz. valores()) {
System. salir. println("[key=" light. name()", value="
mapa actual. get(light) "]"";
}
}
/**
* Demuestra cómo usar la clase abstracta EnumSet para obtener el contenido del tipo de enumeración de un tipo
* Puedes usar allOf método
*/
Conjunto de testenum vacío estático privado() {
EnumSet lt light gtcurrenum set = enum set allof (Light. class); /p>
for(lightsetelement:currEnumSet){
System. println("Los datos en el EnumSet actual son: "aLightSetElement");
}
}
}
Los resultados de la implementación son los siguientes:
Demuestra el recorrido de los tipos de enumeración...
Actual nombre de luz: Rojo
Número de luz actual: 0
Luz actual: 1
Nombre de luz actual: Verde
Número de luz actual: 1
p>Luz actual: 3
Nombre de la luz actual: Amarillo
Número de luz actual: 2
Luz actual: 2
Demuestre el uso y recorrido de los objetos EnmuMap.....
[Clave=rojo, valor=luz roja]
[Clave=verde, valor= luz verde]
[Key=amarillo, valor=luz amarilla]
Demuestra el uso y recorrido de los objetos EnmuSet...
Los datos actuales. en EnumSet es: 1.
Los datos en el conjunto de enumeración actual son: 3
Los datos en el conjunto de enumeración actual son: 2
Cuarto, comúnmente métodos utilizados para definir constantes y enumeraciones La diferencia entre definir constantes
Lo siguiente puede ser aburrido, pero definitivamente vale la pena echarle un vistazo
1. >Estado de clase pública {
p>int final estático público ON = 1;
Int final estático público OFF = 0;
}
¿Qué les pasa a todos? Lo he estado usando durante mucho tiempo. No hay problema.
En primer lugar, debes asegurarte de que sea un int.
En segundo lugar, debes asegurarte de su alcance. es 0 y 1. /p>
Finalmente, muchas veces solo ves 1 y 0 al imprimir
Pero las personas que no han visto el código no saben lo que quieres. hacer y abandonar todas las antiguas constantes finales estáticas públicas.
2. Puedes crear una clase de enumeración y tratarla como una clase normal. Excepto que no puede heredar de otras clases. (Java es de herencia única, hereda Enum),
Puedes agregar otros métodos para anular sus propios métodos.
3. El parámetro switch() puede utilizar enumeraciones.
4. El método value() es un método estático insertado por el compilador en la definición de enumeración. Entonces, cuando convierte una instancia de enumeración en una enumeración principal, no se puede acceder a valores(). Solución: hay un método getenumConstants() en la clase, por lo que incluso si no hay un método de valores() en la interfaz Enum, aún podemos obtener todas las instancias de Enum a través del objeto de clase.
5. No se pueden crear subclases a partir de una enumeración. Si necesita extender los elementos en una enumeración, cree una enumeración que implemente la interfaz dentro de la interfaz para agrupar los elementos. Elementos de enumeración de grupos.
6. Utilice EnumSet en lugar de banderas. Una enumeración requiere que sus miembros sean únicos, pero los elementos agregados no se pueden eliminar en una enumeración.
7. La clave de enummap es enum y el valor es cualquier otro objeto.
Enum permite a los programadores escribir métodos para instancias de eunm. Por lo tanto, a cada instancia de enumeración se le pueden asignar diferentes comportamientos.
9. Utilice la cadena de responsabilidad de enumeración, que está relacionada con el patrón de diseño. Resuelve problemas de muchas maneras diferentes. Luego conéctelos. Cuando llega una solicitud, la cadena se recorre hasta que una solución en la cadena pueda manejar la solicitud.
10. Utilice máquinas de estados enumerados
11. Utilice enumeración para la asignación multidireccional.