2012-08-17 13 views
14

Einige Message-Klasse einen Tag-Namen zurückkehren kann basierend auf Tag-Nummer

Da diese Klasse oft instanziiert ist, ich bin ein wenig widerstrebend eine HashMap für jede Instanz zu erstellen:Java hartcodierte Schalter 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); 
    } 
} 

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

Wenn Sie alles in der Mischung setzen (Memory, Performance, GC, ...)

Gibt es einen Grund, bei HashMap zu bleiben?

+2

Wäre das nicht die Situation, in der ein 'enum' ideal wäre? – Edd

+5

Wenn die Liste für alle Ihre Nachrichten identisch ist, können Sie die Karte auch statisch machen. – assylias

+1

Haben Sie (durch Profiling) auch festgestellt, dass die Instanziierung der Klasse wirklich ein Problem ist? – joergl

Antwort

6

Initialisierung MAP in einem statischen Block.

Und da Sie viele Objekte von Message.you erschaffen sollte Code wie diese

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

Ich wusste nicht über put() in statischen Blöcken aufrufen. Sweet – MonoThreaded

+0

Die Verwendung einer Map kann nicht schneller sein als die Verwendung eines Switches, das macht keinen Sinn. – barjak

+0

@Byter gibt es einen Beweis, dass eine Map (und auch welche Implementierung von Map) schneller ist als ein Switch? Hast du das wirklich getestet? – Eugene

0

Hängt davon ab, was Sie brauchen. Zum Beispiel, wenn Sie jemals alle Tag-Namen für die Anzeige mit einem Map erhalten würde, würde sich auszahlen. Zusätzlich, wenn Sie mit einer TreeMap ersetzt wurden, könnten Sie sie sortiert bekommen.
Wenn Sie keine solche Notwendigkeit haben, wäre die Verwendung einer Map ein Overhead und Ihr Ansatz oder eine Enum wäre viel effizienter (Sie werden weniger Lesbarkeit obwohl als Option von 5-10-20 case Optionen haben)

0

schreiben Warum nicht die getTagName Methode statisch und faul Last aus einer Eigenschaft macht Datei?

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

Einfach zu testen und ohne eine Neukompilierung konfigurierbar.

+0

Eigenschaften Dateien bedeuten zusätzliche Ergebnisse. Da die Liste eher statisch ist, würde ich das Mapping lieber einbetten. – MonoThreaded

0

Wenn alle Ihre Variablenwerte im Intervall [1..n] aufeinander folgen, können Sie ein Array oder vielleicht eine ArrayList verwenden und direkten Zugriff auf die Werte haben.

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

Alternative mit einem Array.

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

Leider ist es keine zusammenhängende Liste – MonoThreaded

+0

@AknownImous Schade. Aber ich werde meine Antwort trotzdem bleiben lassen. – maba

+0

@AknownImous Haben Sie eine Idee, wie die Tags nummeriert sind? Vielleicht können Sie einige Lücken in einem Array zulassen, ohne dass es ohnehin zu viel Speicher beansprucht. – maba

1

Karte kann als Befehlsmuster verwendet werden, in dem Tastaturbefehl Zustand und Wert darstellt ist der einzige Nachteil ausgeführt werden soll, Objekt, bevor sie verwendet erstellt wird, so dass, wenn Sie eine große Anzahl von solchen Bedingungen haben, dann können Sie für Karte entscheiden sonst switch ist immer elegant Ansatz, wenn Ihre Bedingungen gering sind.