¿Qué es un enum?
La enumeración es una nueva característica presentada por JDK5. En algunos casos, un objeto de una clase se fija y se puede definir como un enum. En uso real, los tipos de enumeración también se pueden utilizar como especificación para garantizar la seguridad de los parámetros del programa. La enumeración tiene las siguientes características:
java.lang.Enum en Java por defecto, e implementa dos interfaces: java.lang.Seriablizable y java.lang.Comparable .public static final , y las clases de enumeración no abstractas no pueden derivar subclases. Aquí está equals() en java.lang.Enum :
// Esto se modifica final, y las subclases no pueden reescribir públicos finales iguales booleanos (objeto otro) {return this == otros;} Métodos comunes para la enumeración
int compareTo(E o)
Compare el orden de este enumo con el objeto especificado. Cuando el objeto es menor que, igual o mayor que el objeto especificado, los enteros negativos, cero o enteros positivos se devuelven respectivamente. Las constantes de enumeración solo se pueden comparar con otras constantes de enumeración del mismo tipo de enum.
// Código fuente en enum public Final int Compareto (e o) {enum otro = (enum) o; Enum self = esto; if (self.getclass ()! = other.getClass () && // optimización self.getDeclareDclass ()! = Other.getDeclaringClass ()) Throw New ClassCastException (); return self.ordinal - other.ordinal;} String name()
Devuelve el nombre de esta instancia de enum.
static values()
Devuelve una matriz que contiene todos los valores de ENUM que se pueden usar para iterar a través de todos los valores de ENUM.
String toString()
Devuelve el nombre de esta instancia de enum, es decir, el valor enum. Igual que name() .
// name () y toString () en enum public String toString () {name de return;} public final String name () {return name;} int ordinal()
Devuelve el valor de índice del valor enum en la clase enum (a partir de 0), es decir, el orden del valor enum en la declaración enum, que depende del orden de la declaración del valor enum.
<T extends Enum<T>> valueOf()
Devuelve una constante de enumeración del tipo de enum especificado con el nombre especificado, el nombre debe coincidir exactamente con el identificador utilizado para declarar la constante de enumeración en este tipo (no se permiten caracteres de espacios en blanco adicionales). Este método corresponde a ToString, por lo que si anulamos toString() , debemos anular valueOf() (podemos anular toString() , pero no podemos anular valueOf() por nosotros mismos. Cuando exageramos toString() , valueOf() volverá automáticamente, y no necesitamos prestar atención a él).
Aplicación de enumeración
La enumeración es un tipo especial, y su uso es muy similar al de las clases ordinarias.
Reemplazar un conjunto de constantes
Color en enum público {rojo, verde, en blanco, amarillo} Utilizado en declaraciones de conmutador
// El interruptor ha agregado soporte para enum en JDK1.6 Signal enum {verde, amarillo, rojo} ... interruptor (color) {case rojo: color = señal.green; romper; } ... Agregar métodos a Enum
Color de enum public {rojo ("rojo"), verde ("verde"), en blanco ("blanco"), yello ("amarillo"); // nombre de cadena privada variable de variable; // constructor de color privado (nombre de cadena) {this.name = name; } // Obtener el método establecido public String getName () {Return Name; } public void setName (nombre de cadena) {this.name = name; }} Implementar la interfaz
Comportamiento de interfaz pública {void print (); } Color de enum public en enum implementa el comportamiento {rojo ("rojo", 1), verde ("verde", 2), en blanco ("blanco", 3), yello ("amarillo", 4); // Método de interfaz @Override public void print () {System.out.println (this.index+":"+this.name); }} Clase de enumeración que contiene métodos abstractos
Operación Public Enum {// utilizada para realizar operaciones adicionales más {// La parte de los aparatos ortopédicos es en realidad una subclase interna anónima @Override Public Cálculo (doble x, doble y) {return x + y; }}, // utilizado para realizar operaciones de sustracción menos {// La parte de los aparatos ortopédicos es en realidad una subclase interna anónima @Override public Public Cálculo (doble x, doble y) {// TODO Método Generado automático retorno x - y; }}, // utilizado para realizar tiempos de operaciones de multiplicación {// La parte de los aparatos ortopédicos es en realidad una subclase interna anónima @Override public Public Cálculo (doble x, doble y) {return x * y; }}, // utilizado para realizar la operación de división Divide {// La parte de los auxiliares rizados es en realidad una subclase interna anónima @Override public Public Calculación (doble x, doble y) {return x / y; }}; // Defina un método abstracto para esta clase de enumeración. Todos los valores de Enum en la clase de enumeración deben implementar este método Public Abstract Double Calcule (doble x, doble y);} Implementación de singletons con enumeraciones (mejores prácticas para singletons)
beneficio:
1.Utilice las características de la enumeración para implementar casos individuales
2. El JVM asegura la seguridad del hilo
3. Los ataques de serialización y reflexión se han resuelto por enumeración
public enum Singleton {instancia; public singleton getInstance () {// Agregue este método para que otros comprendan cómo usarlo, porque este método de implementación es relativamente raro. instancia de retorno; }} Otro uso de enumeración
Enumeta
range(E from, E to)
Obtenga un rango de conjunto del valor enum.
para (Día de WeekDayenum: enumset.Range (WeehDayenenum.Mon, WeehDayenum.fri)) {System.out.println (día); } of(E first, E... rest)
Crea un conjunto de enumeración que contiene originalmente los elementos especificados.
noneOf(Class<E> elementType)
Crea un conjunto de enumeración vacío con el tipo de elemento especificado.
Enumma
EnumMap(Class<K> keyType)
Crea un mapa de enumeración vacío con el tipo de tecla especificado.
MAP <Weather, String> enummap = new Enummap <Weather, String> (Weather.class); enummap.put (Weather.sunny, "Sunny"); enummap.put (Weather.Rainy, "Rainy");
Enumeración en Android
Enum necesita ocupar una gran cantidad de memoria. Si es sensible a la memoria, intente usar a Enum lo menos posible y reemplácelo con una constante estática.
Sin embargo, si no utiliza la enumeración, surgirán algunos riesgos de seguridad, por lo que el funcionario ha lanzado dos anotaciones, que pueden verificarse tipo durante el período de compilación para reemplazar la enumeración. Estas dos anotaciones son: @intdef y @stringdef. Ubicado en compilar 'com.android.support:support-annotations:+'.
Ejemplo de uso
El uso de @stringdef es consistente con @Intdef. Aquí tomamos @intdef como ejemplo.
interfaz pública qrcodetype {int weChat = 0; int Alipay = 1; @Intdef ({weChat, alipay}) @Retention (retentionPolicy.source) @Target ({elementType.field, elementType.method, elementtype.parameter}) @interface verificador public void settype (@qrcodetype.checker int type) {// Definir en el parámetro this.type = type; } @Qrcodetype.ecker // Definir en el método (es decir, verifique el tipo de valor de retorno) public int getType () {return type; }} Recomendaciones para su uso
El rango más utilizado en el desarrollo es usar enumeraciones en lugar de un conjunto de constantes estáticas. En este caso, el método de anotación anterior se puede utilizar en su lugar.
Cuando una enumeración también contiene otras funciones (como: incluyendo otros métodos definidos), no se puede reemplazar.
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo sea de ayuda para su estudio o trabajo. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse.