2012-08-17 25 views
14

alguna clase de mensajes es capaz de devolver un nombre de etiqueta basado en el número de etiqueta

Dado que esta clase es instanciada muchas veces, soy un poco reacio a crear un HashMap para cada instancia:Java interruptor codificado vs HashMap

public class Message { 
    private HashMap<Integer,String> tagMap; 

    public Message() { 
    this.tagMap = new HashMap<Integer,String>(); 
    this.tagMap.put(1, "tag1Name"); 
    this.tagMap.put(2, "tag2Name"); 
    this.tagMap.put(3, "tag3Name"); 
    } 

    public String getTagName(int tagNumber) { 
    return this.tagMap.get(tagNumber); 
    } 
} 

a favor de hardcoding:

public class Message { 
    public Message() { 
    } 

    public String getTagName(int tagNumber) { 
    switch(tagNumber) { 
     case 1: return "tag1Name"; 
     case 2: return "tag2Name"; 
     case 3: return "tag3Name"; 
     default return null; 
    } 
    } 
} 

Cuando se pone todo en la mezcla (memoria, el rendimiento, GC, ...)

¿Hay alguna razón para apegarse a HashMap?

+2

¿No sería este el tipo de situación en la que un 'enum' sería ideal? – Edd

+5

Si la lista es la misma para todos sus mensajes, también puede hacer que el mapa sea estático. – assylias

+1

Además, ¿determinó usted (al elaborar el perfil) que la ejemplificación de la clase es realmente un problema? – joergl

Respuesta

6

Inicializa MAP en un bloque estático.

Y ya que usted será la creación de muchos objetos de Message.you debe escribir código como este

public class Message { 

    private static HashMap tagMap; 

    static { 
    tagMap = new HashMap(); 
    tagMap.put(1, "tag1Name"); 
    tagMap.put(2, "tag2Name"); 
    tagMap.put(3, "tag3Name"); 
    } 

    public Message() { 

    } 

    public String getTagName(int tagNumber) { 
    return tagMap.get(tagNumber); 
    } 
} 
+0

No sabía acerca de llamar a put() en bloques estáticos. Sweet – MonoThreaded

+0

Usar un mapa no puede ser más rápido que usar un interruptor, esto no tiene sentido. – barjak

+0

@Byter ¿hay alguna prueba de que un Mapa (y también qué implementación de Mapa) es más rápido que un cambio? ¿Lo has probado realmente? – Eugene

0

Depende de lo que necesite. Por ejemplo, si alguna vez necesitó obtener todos los nombres de las etiquetas para mostrar usando un Map, pagaría. Además, si reemplazó con un TreeMap, puede ordenarlos.
Si no tiene esa necesidad, usar un Map sería una sobrecarga y su enfoque o un Enum sería mucho más eficiente (tendrá menos facilidad de lectura que la opción de 5-10-20 case opciones)

0

Por qué no hacer el método getTagName carga estática y perezoso desde un archivo de propiedades?

public static String getTagName(int tagNumber) { 
    if tagsByID == null) { 
     // load tags from properties 
    } 
    return tagsByID.get(tagNumber); 
} 

Fácil de probar y configurar sin necesidad de volver a compilar.

+0

Los archivos de propiedades significan entregables adicionales. Como la lista es bastante estática, prefiero insertar el mapeo. – MonoThreaded

0

Si todos los valores de sus etiquetas son consecutivos en el intervalo [1..n], puede usar una matriz o tal vez un ArrayList y tener acceso directo a los valores.

public class Message { 
    private ArrayList<String> tags; 

    public Message() { 
     this.tags = = new ArrayList<String>(); 
     this.tags.add("Unknown"); 
     this.tags.add("tag1Name"); 
     this.tags.add("tag2Name"); 
     this.tags.add("tag3Name"); 
    } 

    public String getTagName(int tagNumber) { 
     return this.tags.get(tagNumber); 
    } 
} 

Alternativa con una matriz.

public class Message { 
    private static final String[] tags = { 
     "N/A", 
     "tag1Name", 
     "tag2Name", 
     "tag3Name", 
     null, 
     null, 
     "tag6Name", 
    }; 

    public Message() { 
    } 


    public String getTagName(int tagNumber) { 
     if (tagNumber < 0 || tagNumber > tags.length) { 
      throw new IllegalArgumentException(); 
     return tags[tagNumber]; 
    } 
} 
+0

Desafortunadamente no es una lista contigua – MonoThreaded

+0

@AknownImous. Lástima. Pero dejaré que mi respuesta permanezca de todos modos. – maba

+0

@AknownImous ¿Tiene alguna idea de cómo están numeradas las etiquetas? Tal vez pueda permitir algunas lagunas en una matriz sin que tome demasiada memoria de todos modos. – maba

1

mapa se puede utilizar como patrón de mando en la tecla que representa la condición y valor representa el comando a ejecutar el único inconveniente es objeto se creó antes de utilizar por lo que si usted tiene gran número de tales condiciones, entonces puede optar por mapa else switch siempre es un enfoque elegante si sus condiciones son pocas.