2012-06-30 30 views
6

Cuál es la diferencia entre este:EnumMap vs Enum valores

public enum Direction { 
    NORTH(90), 
    EAST(0), 
    SOUTH(270), 
    WEST(180); 

    private final int degree_; 

    private Direction(int degree) { 
     degree_ = degree; 
    } 

    public int getDegree() { 
     return degree_; 
    } 

    public static void main(String[] args) { 
     System.out.println(NORTH.getDegree()); 
    } 
} 

y esto:

public enum Direction { 
    NORTH, 
    EAST, 
    SOUTH, 
    WEST; 

    public static void main(String[] args) { 
     EnumMap<Direction, int> directionToDegree = new EnumMap<Direction, int>(Direction.class); 
     directionToDegree.put(NORTH, 90); 
     directionToDegree.put(EAST, 0); 
     directionToDegree.put(SOUTH, 270); 
     directionToDegree.put(WEST, 180); 

     System.out.println(directionToDegree.get(NORTH)); 
    } 
} 

Es uno más fácil de leer? ¿Es uno más flexible? ¿Se usa uno de manera más convencional? ¿Corre uno más rápido? ¿Algún otro pros y contra?

Respuesta

6

El primer caso tiene una propiedad vinculada al valor enum (solo un valor).

El segundo que tiene el valor asociado a la enumeración administrada fuera.

Imagine ahora en su aplicación que desea acceder a estos valores. Si esto es constante en el segundo caso, sería mucho más complicado derivar el mapa de todas partes.

El segundo enfoque sería útil cuando tiene contextos diferentes. Por ejemplo: NORTH, en un contexto específico NORTH debe ser 90, pero en otro contexto se necesitaría otro valor asociado (un contexto aquí podría ser una implementación específica).

+0

¿por qué la propiedad está "limitada"? ¿Es esto un error tipográfico para "servidumbre"? No es quisquilloso, curioso. – Thufir

+0

@Thufir: gracias, fue un error ortográfico –

+0

LOL, pensé que había un significado especial :) Estaba pensando en los límites superiores e inferiores .. etc – Thufir

6

La adición de valores a las constantes enum los hace utilizables sin una referencia a otro objeto. Si almacena esta información en un mapa, debe pasar referencias al mapa. Si estas son propiedades fundamentales de las nociones que representan las constantes, probablemente sea mejor agregar los valores a las constantes en lugar de almacenarlas en un mapa.

Usar valores en las constantes enum será más rápido que almacenarlos en un mapa.

+0

¿Por qué el primer método sería más rápido? – Geek

7

El caso de uso principal para el EnumMap es cuando desea adjuntar datos adicionales a un enum que no le pertenece. Normalmente está utilizando una biblioteca pública que tiene una enumeración y necesita anotar a cada miembro con sus datos.

Como regla general, siempre que tenga a su disposición ambos enfoques, use el primero.

+0

Me parece que sus respuestas están llenas de aplicaciones prácticas de cuándo hacer qué? Gracias y +1. – Geek

+0

Muchas gracias, esa es la mejor explicación que encontré. – Heaven42