2012-08-17 23 views
14

Niektóre klasy wiadomości jest w stanie powrócić nazwę znacznika na podstawie numeru znacznika

Ponieważ ta klasa jest instanciated wiele razy, jestem trochę niechętnie, aby utworzyć HashMap dla każdej instancji:Java ustalony przełącznik 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); 
    } 
} 

na rzecz 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; 
    } 
    } 
} 

Kiedy można umieścić wszystko w miksie (Pamięć, Performance, GC, ...)

Czy istnieje powód, aby trzymać się HashMap?

+2

Czy nie byłaby to sytuacja, w której "enum" byłby idealny? – Edd

+5

Jeśli lista jest taka sama dla wszystkich wiadomości, można również uczynić mapę statyczną. – assylias

+1

Czy ty (poprzez profilowanie) ustaliłeś, że instancja klasy jest naprawdę problemem? – joergl

Odpowiedz

6

Inicjuj MAP w bloku statycznym.

a ponieważ będą tworzyć wiele obiektów Message.you należy napisać kod jak ten

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

Nie wiedziałem o wywołaniu funkcji put() w statycznych blokach. Sweet – MonoThreaded

+0

Używanie mapy nie może być szybsze niż użycie przełącznika, to nie ma sensu. – barjak

+0

@Byter czy istnieje jakiś dowód na to, że mapa (a także jaka implementacja mapy) jest szybsza niż przełącznik? Czy to naprawdę przetestowałeś? – Eugene

0

Zależy od potrzeb. Na przykład, jeśli kiedykolwiek będziesz potrzebował uzyskać wszystkie nazwy znaczników do wyświetlenia, skorzystaj z opcji Map. Dodatkowo, jeśli zastąpisz je TreeMap, możesz je posortować.
Jeśli nie masz takiej potrzeby, użycie Map będzie kosztować więcej, a twoje podejście lub Enum będzie znacznie wydajniejsze (będziesz mieć mniej czytelności niż opcje 5-10-20 case)

0

Dlaczego nie uczynić metoda getTagName statyczne i leniwy obciążenie go z pliku właściwości?

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

Łatwy do przetestowania i konfiguracji bez ponownej kompilacji.

+0

Pliki właściwości oznaczają dodatkowe produkty. Ponieważ lista jest raczej statyczna, wolę osadzić mapowanie. – MonoThreaded

0

Jeśli wszystkie wartości zmiennych są następujące po sobie w przedziale [1..n], można użyć tablicy lub może być ArrayList i mieć bezpośredni dostęp do wartości.

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); 
    } 
} 

Alternatywa z tablicą.

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

Niestety nie jest to ciągła lista. – MonoThreaded

+0

@AknownImous Szkoda. Ale pozwolę, aby moja odpowiedź i tak pozostała. – maba

+0

@AknownImous Czy masz pojęcie, jak tagi są ponumerowane? Być może możesz zezwolić na pewne luki w tablicy bez pobierania zbyt dużej ilości pamięci. – maba

1

Mapa może być używany jako wzorzec poleceń, w którym klucz reprezentuje stan i wartość reprezentuje polecenie do wykonania jedyną wadą jest obiekt zostanie utworzony przed używany więc jeśli masz dużą liczbę takich warunkach to można zdecydować się na mapie inaczej switch to zawsze eleganckie podejście, jeśli twoje warunki są niewielkie.