La investigación principal en este artículo es el contenido relevante de Enummap en lugar del índice ordinal en Java, que se introduce de la siguiente manera.
Notas de estudio "Edición china de Java Efection 2"
A menudo se encuentra utilizando el método ordinal de Enum para indexar los tipos de enum.
Herba de clase pública {Tipo de enum público {anual, perenne, bienal}; Nombre de cadena final privado; Tipo de tipo final privado; Hierba (nombre de cadena, tipo de tipo) {this.name = name; this.type = type; } @Override public string toString () {nombre de retorno; }}Ahora suponga que hay una variedad de hierbas que representan plantas en un jardín que desea organizar por tipo (anual, perenne o bienal) antes de enumerar estas plantas. Si desea hacer esto, debe construir tres conjuntos, uno para cada tipo e iterar a través de todo el jardín y colocar cada hierba en el conjunto correspondiente. Algunos programadores lo hacen colocando estos conjuntos en una matriz indexada por números ordinales de tipos.
// Uso de Ordinal () para indexar una matriz - No haga thisHerb [] jardín = ...; // indexado por herb.type.ordinal () set <Herb> [] herbsbytype = (set <Herb> []) nuevo set [herb.type.values (). Longitud]; para (int i = 0; i <herbsbytype.length; i ++) {herbsbytype [i] = new Hashset <Herb> ();} para (Herb H: Garden) {HerbsbyType [H.Type.ordinal ()]. Agregar (h);} // Imprimir los resultados para (int i = 0; i <HerbsbytypeTypeTypeTiNinal; i ++) System.out.printf ("%s:%s%n", herb.type.values () [i], herbsbytype [i]);}Este método es realmente factible, pero oculta muchos problemas. Porque las matrices no son compatibles con los genéricos. El programa debe realizar conversiones sin control y no se puede compilar correctamente. Debido a que la matriz no sabe qué representa su índice, debe etiquetar manualmente la salida de estos índices. Pero el problema más grave con este método es que cuando accede a una matriz indexada por el número Ordinal enum, es su responsabilidad utilizar el valor int correcto; INT no puede proporcionar seguridad de tipo para enumeros. Si usa el valor incorrecto, el programa completará silenciosamente el trabajo incorrecto, o si tiene suerte, lanzará una excepción de ArrayIndexOutOfBoundException .
java.util.enummap es una implementación de mapa muy rápida que se usa específicamente para la enumeración.
// Uso de un enummap para asociar datos con un enummap <herb.type, establecer <Herb>> HerbsbyType = new Enummap <Herb.Type, set <Herb>> (herb.type.class); para (Herb.Type T: Herb.Type.Values) Herbsbytype.put (T, New Hashset <Herb> ()); para (Herb H: Garden) HerbsbyType.get (H.Type) .add (H); System.out.println (HerbsbyType);
Este programa es más corto, más claro y seguro, y puede ejecutarse a una velocidad comparable a la de los programas que usan números ordinales. No tiene conversiones inseguras; No tiene que etiquetar la salida de estos índices manualmente, porque las claves de mapeo saben cómo traducirse en una enumeración de cadenas imprimibles; También es imposible cometer errores al calcular los índices de matriz . La razón por la cual Enummap es comparable a las matrices indexadas a través de índices ordinales en términos de velocidad de ejecución es que Enummap usa esta matriz internamente. Pero oculta este tipo de detalle de pensamiento de los programadores, combinando la rica funcionalidad del mapa y la seguridad del tipo con la velocidad de las matrices. Tenga en cuenta que el constructor enummap usa un objeto de clase de tipo clave: este es un token de tipo limitado que proporciona información genérica de tiempo de ejecución.
Resumir
Lo anterior es toda la explicación detallada del enummap en lugar del código de índice ordinal en Java. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!