¿Qué significa enum en java?
Los tipos de enumeración han aparecido desde hace mucho tiempo en los lenguajes de programación. Se utilizan para contener un grupo de valores similares en un tipo. El nombre del tipo de enumeración se definirá como un descriptor de tipo único, similar a la definición de una constante. Sin embargo, los tipos de enumeración pueden proporcionar una gama más amplia de valores para las variables declaradas que los tipos constantes.
Por ejemplo, si quieres colorear el arco iris con siete colores, puedes hacerlo definiendo constantes en tu programa Java.
Listado 1. Definición de constante
¿Público? ¿Electricidad estática? ¿clase? ¿Color del arcoíris? {?
//?Define constantemente siete colores: rojo, naranja, amarillo, verde, cian, azul y morado.
¿Público? ¿Electricidad estática? finales? int? ¿rojo? =?0;?
¿Público? ¿Electricidad estática? finales? int? color naranja? =?1;?
¿Público? ¿Electricidad estática? finales? int? ¿amarillo? =?2;?
¿Público? ¿Electricidad estática? finales? int? ¿verde? =?3;?
¿Público? ¿Electricidad estática? finales? int? ¿azul? =?4;?
¿Público? ¿Electricidad estática? finales? int? ¿azul? =?5;?
¿Público? ¿Electricidad estática? finales? int? ¿Púrpura? =?6;?
}Cuando se utilizan, se puede hacer referencia directamente a estas constantes en el programa. Sin embargo, todavía existen algunos problemas con este enfoque.
Escriba no seguro.
Debido a que el valor correspondiente a la constante de color es un número entero, es muy probable que cualquier valor entero se pase a la variable de color durante la ejecución del programa, lo que resultará en un error.
Sin espacio de nombres.
Dado que las constantes de color son sólo propiedades de la clase, al utilizarlas se debe acceder a ellas a través de la clase.
Pobre coherencia
Debido a que la enumeración de enteros es una constante en tiempo de compilación, una vez completado el proceso de compilación, todos los lugares a los que hacen referencia el cliente y el servidor escribirán directamente el valor entero. De esta manera, cuando modifica el valor entero de enumeración anterior o agrega un nuevo valor de enumeración, es necesario volver a compilar todo el código nativo al que se hace referencia; de lo contrario, se producirá un error en tiempo de ejecución.
Incertidumbre de tipos
Dado que los valores de enumeración de colores son solo valores enteros sin sentido, si depura en tiempo de ejecución, encontrará que hay muchos números mágicos en el registro, pero excepto Para el propio programador, es difícil que otros comprendan el misterio.
Cómo definir tipos de enumeración
Para mejorar las deficiencias del lenguaje Java a este respecto y compensar las deficiencias, cuando se lanzó la versión SDK 5.0, los tipos de enumeración fueron agregado a nivel de idioma. La definición de un tipo de enumeración también es muy simple, simplemente use la palabra clave enum y el nombre y el cuerpo del valor de la enumeración entre llaves. Por ejemplo, los colores del arco iris mencionados anteriormente se pueden redefinir usando la nueva enumeración:
enum? ¿Color del arcoíris? {?¿rojo? Mandarina,? ¿Amarillo? ¿verde? azul,? ¿Azul? ¿Púrpura? } Según el formulario de definición anterior, parece que el tipo de enumeración en Java es muy simple, pero de hecho la especificación del lenguaje Java le da al tipo de enumeración funciones muy poderosas. Va más allá de simplemente convertir valores enteros en objetos, también convierte definiciones de tipos de enumeración en definiciones de clases completamente funcionales. Esta extensión de la definición de tipo permite a los desarrolladores agregar cualquier método y propiedad al tipo de enumeración y también implementar cualquier interfaz. Además, la plataforma Java también proporciona implementaciones de alta calidad para el tipo Enum, como las implementaciones predeterminadas de las interfaces Comparable y Serializable, por lo que los desarrolladores generalmente no necesitan preocuparse por estos detalles.
Volviendo al tema de este artículo, ¿qué beneficios puede aportar a nuestro desarrollo la introducción de tipos de enumeración? Uno de los beneficios más directos es ampliar el alcance de uso de la declaración de cambio. Antes de 5.0, el valor de switch en Java solo podía ser de tipos simples, como int, byte, short y char. Después de enumerar los tipos, se pueden utilizar objetos. De esta manera, la selección de control del programa se vuelve más conveniente, vea el siguiente ejemplo:
Listado 2. Definir tipo de enumeración
//? Defina el tipo de enumeración para los siete días de la semana.
¿Público? enumeración? ¿Enumeración del día de la semana? {?¿Madre? ¿Martes? ¿Miércoles? ¿Jueves? ¿Vie? Se sentó,? ¿Sol? }?
//?Leer la información del día
WeekDayEnum? ¿Hoy? =?leerHoy();?
//?Seleccione actividades según la fecha.
¿Cambiar (hoy)? {?
Lunes:? ¿Hacer lo? cosa;? interrumpir;?
Martes:? ¿Hacer lo? cosa;? interrumpir;?
Miércoles:? ¿Hacer lo? cosa;? interrumpir;?
Jueves:? ¿Hacer lo? cosa;? interrumpir;?
Viernes:? ¿Hacer lo? cosa;? interrumpir;?
Sáb:? ¿Jugar? ¿educación física? juego;? interrumpir;?
Sol:? ¿Hay alguno? ¿respuesta? descansar;? interrumpir;?
Para estas fechas enumeradas, la JVM construirá una instancia de objeto correspondiente uno a uno simple en tiempo de ejecución. Estos objetos tienen identificadores únicos, similares a valores enteros, y la instrucción switch realiza saltos en consecuencia.
Cómo personalizar los tipos de enumeración
Además de las definiciones de enumeración más comunes anteriores, si necesita agregar algunas funciones complejas al tipo de enumeración, también puede personalizarlas mediante clases. como definiciones. Por ejemplo, para agregar propiedades a un tipo de enumeración, puede definirlas de la siguiente manera:
Listado 3. Tipo de enumeración personalizado
//?¿Definición? RSS (¿En serio? ¿Simple? ¿Sindicado)? Tipo de semilla de enumeración
¿Pública? enumeración? ¿Noticias? {?
//?Titulares de Yahoo? ¿RSS? Semillas
YAHOO _ TOP _ STORIES("/RSS/topstories "),?
//CBS? ¿Titulares? ¿RSS? Semillas
CBS_TOP_STORIES("/CBSNewsMain? format=xml "),?
//?¿Titulares del Los Angeles Times? ¿RSS? HISTORIAS
LATIMES _ TOP _ STORIES("/LATIMES/news? formato = XML ");?
//?Objeto de enumeración? ¿RSS? Atributo de dirección
¿Privado? ¿Cadena? rss_url?
//?Constructor de objetos de enumeración
¿Privado? NewsRSSFeedEnum(Cadena?rss)? {?
este.rss_url? =?rss?
}?
//?¿Obtener objeto de enumeración? ¿RSS? Método de dirección
¿Público? ¿Cadena? obtenerRssURL()? {?
¿Volver? this.rss_url?
}?
}El tipo de enumeración de los titulares de noticias anteriores agrega un atributo de dirección RSS para registrar la dirección de acceso de los titulares de noticias. Al mismo tiempo, el valor de la dirección de acceso RSS debe pasarse externamente, por lo que es necesario definir un constructor para inicializar este atributo. Además, debe proporcionar un método para leer la dirección RSS.
Cómo evitar el mal uso de enumeraciones
Sin embargo, hay varios puntos a tener en cuenta al usar Enum:
El tipo de enumeración no admite la construcción de enumeraciones públicas y Los modificadores protegidos funcionan, por lo que el constructor debe ser privado o amigable. Por lo tanto, un objeto de enumeración no se puede inicializar llamando a su constructor directamente en el programa.
Al definir un tipo de enumeración, si es un tipo simple, entonces el último valor de enumeración no necesita ir seguido de ningún símbolo, pero si hay un método personalizado, entonces el último valor de enumeración y el; Se debe utilizar el siguiente código. Separe con punto y coma ";", sin comas ni espacios.
Debido a que los valores de los tipos de enumeración en realidad se representan mediante la construcción de objetos en tiempo de ejecución, en un entorno de clúster, cada máquina virtual construirá un objeto de enumeración sinónimo. Por lo tanto, debe tenerse en cuenta que si usa el operador de signo igual (' = = ') directamente, estos valores de enumeración aparentemente idénticos deben ser desiguales porque no son la misma instancia de objeto.
Vea el siguiente ejemplo:
Listado 4.
Evite el uso indebido de ejemplos de enumeración
//? Defina el tipo de enumeración para los siete días de la semana.
¿Paquete? ejemplo.enum.code;?
¿Público? enumeración? ¿Enumeración del día de la semana? {?
Lun(1),? Martes(2),? Mié(3),? Jue(4),? Vie(5),? Sáb(6),? Sol(7);?
¿Privado? int? índice;?
WeekDayEnum(int?idx)? {?
este.índice? =?idx?
}?
¿Público? int? obtener índice()? {?
¿Volver? índice;?
}?
}//?El programa cliente envía el valor de enumeración al servidor a través de la red.
¿Paquete? ejemplo.enum.code;?
¿Importado? Java io .io excepción;?
¿Importado? Java .io flujo de salida de objetos;?
¿Importado? Java .io .flujo de salida;?
¿Importado? Java net .
¿Importado? Red de Java.
¿Importado? Java net .excepción de host desconocido;?
¿Público? ¿clase? ¿Enumerar clientes? {?
¿Público? ¿Electricidad estática? ¿Vacío? principal(cadena...?argumentos)? ¿Tiro que cae? ¿Excepción de host desconocida? ¿IOExcepción? {?
¿Enchufe? ¿enchufe? =?¿Nuevo? enchufe();?
//?Establece una conexión con el servidor.
socket.connect(new?InetSocketAddress(" 127 . 0 . 0 . 1 ", 8999));?
//?Obtener el flujo de salida de la conexión
OutputStream? ¿os? =?socket.obtener flujo de salida();?
¿ObjectOutputStream? ¿ooo? =?¿Nuevo? ObjectOutputStream (SO);?
//? Pasa el valor de enumeración del viernes al servidor.
oos.writeObject(WeekDayEnum.Fri);?
OOS .cerrar();?
SO .cerrar();?
zócalo .cerrar();?
}?
}?
//?Un programa del lado del servidor que aplica procesamiento lógico a los valores de enumeración recibidos del cliente.
¿Paquete? ejemplo.enum.code;?
¿Importado? java.io.*;?
¿Importado? ¿Java net?
¿Importado? Red de Java.
¿Público? ¿clase? ¿Servidor de enumeración? {?
¿Público? ¿Electricidad estática? ¿Vacío? principal(cadena...?argumentos)? ¿Tiro que cae? IOExcepción,? ¿Excepción de clase no encontrada? {?
¿ServerSocket? ¿servidor? =?¿Nuevo? zócalo del servidor (8999);?
//?Establecer la interceptación de la conexión de red del lado del servidor
¿Socket? ¿enchufe? =?servidor .aceptar();?
//?Obtiene el flujo de entrada de la conexión.
¿Entrada de flujo? ¿Sí? =?socket.getinputstream();?
¿ObjectInputStream? ¿ois? =?¿Nuevo? ObjectInputStream (sí);?
//?Lea el valor de enumeración pasado por el cliente.
¿SemanaDíaEnum? ¿día? =?(EnumerDíaSemana)? ¿Ois .read objeto();?
//?Compare objetos de enumeración mediante comparación de valores.
¿Y si? (¿Día? ==? Enumeración de días laborables. ¿Viernes)? {?
System.out.println("¿cliente? ¿Viernes? ¿enum? ¿valor? ¿Es? ¿igual? que? el servidor");?
}? ¿si? (day.equals(WeekDayEnum.Fri)?{?
System.out.println("¿cliente? ¿Viernes? ¿enum? ¿Valor? ¿Sí? ¿Igual? ¿Dónde? Servidor");?
p>
}?{?
System.out.println("¿cliente? ¿Viernes? ¿enum? ¿valor? ¿Sí? ¿No? ¿Igual que? Servidor");? >
}?
¿Utilizar el método ? switch? para comparar objetos de enumeración? {?
Caso lunes:? ("¿El lunes?");
¿Caso?
System.out.println("¿El martes?"); >¿Caso?
p>System.out.println("¿Miércoles? ¿Trabajar");
Caso
System.out.println( "¿Hacer? ¿Jueves? ¿Trabajar");?
Descanso;?
System.out .println("¿Hacer? Viernes? ¿Trabajar");? Descanso;?
System.out.println(" ? Sábado? Trabajo");?
Descanso;?
Caso:?
System.out.println("¿Domingo? Trabajando");?
Pausa;?
Predeterminado:?
System.out .println("¿Yo? ¿No? ¿Sabes? ¿Cuál? Son ? días");?
¿Descanso;?
}?
ois . ();?
es .close ();?
socket .close();? El resultado de la impresión es el siguiente:
Viernes del cliente El valor de enumeración es el mismo que el del servidor.
Trabajo del viernes
A través de los resultados de la ejecución del programa, puede Se encontrará que en una situación distribuida, se genera una enumeración en las máquinas virtuales del cliente y del servidor. Incluso si el valor de la enumeración Fri parece el mismo, si usa el signo igual '==' para comparar, habrá. desigualdad. La declaración de cambio compara el valor del objeto de enumeración a través del método igual, por lo que cuando su objeto de enumeración es complejo, debe tener cuidado con los métodos anulados para evitar errores en las comparaciones de valores.
Clases de herramientas relacionadas con la enumeración
En JDK5.0, al agregar la clase Enum, también se agregaron dos clases de herramientas, EnumSet y EnumMap, en el paquete java.util. EnumSet es una implementación de interfaz Set de alto rendimiento del tipo de enumeración.
Todos los objetos de enumeración cargados en EnumSet deben ser del mismo tipo y implementarse como vectores de bits, es decir, como un número largo. EnumSet admite atravesar todos los valores del tipo de enumeración. Volver al ejemplo anterior de enumeración de fechas:
enum? ¿Enumeración del día de la semana? {?¿Madre? ¿Martes? ¿Miércoles? ¿Jueves? ¿Vie? Se sentó,? ¿Sol? } Puede iterar durante los siete días de la semana, la clase EnumSet proporciona un rango de métodos estáticos para que la iteración sea fácil de realizar:
for(WeekDayEnum?Day?:?EnumSet.range(WeekDayEnum.Mom ?Enumeración del día de la semana.Viernes )?
System.out.println(日);?
}El resultado de la impresión es el siguiente:
¿Lunes? ?
¿Boda?
Jue?
FriEnumSet también proporciona muchos tipos de métodos seguros para obtener subconjuntos:
EnumSet<WeekDayEnum>? .of(WeekDayEnum.WeekDayEnum.wed);? :?Subset)? {?
System.out.println(日);
}El resultado de la impresión es el siguiente:
Monkey?
Wed es similar a EnumSet. También es una implementación de interfaz Map de alto rendimiento, que se utiliza para administrar tablas de mapeo con tipos de enumeración como claves. combina una interfaz de mapa rica y segura con un rápido procesamiento de matrices. Si desea asignar tipos de enumeración a valores, debe usar EnumMap. Consulte el siguiente ejemplo:
Ejemplo de EnumMap. ¿Definir un EnumMap?, ¿la clave principal del mapa es el tipo de enumeración de fecha y el valor es el tipo de enumeración de color? Map<WeekDayEnum,?
New ltWeekDayEnum,? p>
static{?
// Dibujar cada día de la semana con un determinado color del arcoíris
¿Para qué (int?i?=?0; ?i?<?WeekDayEnum.values().length;?i++)? {?
esquema . put( enumeración del día de la semana . valores()[I],? color del arco iris . valores()[I] );?
}?
}?
System. out.println("¿Qué? ¿En serio? ¿Eso? ¿Suerte? ¿Color? ¿Hoy?"); ?
System.out.println("¿En serio? "?+?schema.get(WeekDayEnum.sat)); Cuando preguntas por el color de la suerte del sábado, obtienes azul:
Listado 6. Resultados corrientes
¿Qué es la suerte de hoy? color?
Es azul
Conclusión
El tipo Enum aporta una gran comodidad a la programación JAVA, lo que hace que el control del programa sea más fácil y no propenso a errores. Entonces, cuando necesites controlar el flujo del programa, puedes pensar más en si se puede lograr usando enum
.