2012-08-17 65 views
14

一些Message類是能夠返回標籤名基於標籤號碼

因爲此類實例化以後,很多時候,我有點捨不得爲每個實例創建一個HashMap:Java的硬編碼開關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); 
    } 
} 

贊成硬編碼的:

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

當你把一切都在混合(內存,性能,GC,...)

是否有理由堅持HashMap?

+2

難道這不是'枚舉'會是理想的情況嗎? – Edd 2012-08-17 09:48:32

+5

如果列表對於所有消息都是相同的,那麼也可以使地圖變爲靜態。 – assylias 2012-08-17 09:49:52

+1

另外,你是否(通過剖析)確定該類的實例化確實是一個問題? – joergl 2012-08-17 09:51:00

回答

6

在靜態塊中初始化MAP

而且因爲你將要創建Message.you的許多對象應該這樣寫代碼

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

我不知道如何在靜態塊中調用put()。 Sweet – MonoThreaded 2012-08-17 09:58:44

+0

使用Map不能比使用開關更快,這沒有任何意義。 – barjak 2012-08-17 10:00:38

+0

@Byter是否有任何證據表明Map(以及Map的實現)比交換機更快?你真的測試過這個嗎? – Eugene 2012-08-17 10:01:52

0

取決於你需要什麼。例如,如果您需要使用Map來獲取所有顯示的標籤名稱,那麼這個名稱就可以獲得回報。此外,如果您替換爲TreeMap,則可以對它們進行排序。
如果您沒有這種需求,那麼使用Map將會是一種開銷,您的方法或Enum會更有效率(儘管比您選擇5-10-20 case選項的可讀性要低)

0

爲什麼不從屬性的getTagName方法靜態和懶加載文件?

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

易於測試和配置,無需重新編譯。

+0

屬性文件意味着額外的可交付成果。由於列表相當靜態,我寧願嵌入映射。 – MonoThreaded 2012-08-17 10:02:41

0

如果所有標記值在區間[1..n]中連續,則可以使用數組或可以使用ArrayList,並且可以直接訪問這些值。

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

用數組替代。

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

不幸的是它不是一個連續的列表 – MonoThreaded 2012-08-17 09:59:21

+0

@AknownImous太糟糕了。但我會讓我的答案依然存在。 – maba 2012-08-17 10:00:57

+0

@AknownImous你有什麼想法如何標籤編號?也許你可以在數組中留出一些空白,而不會佔用太多內存。 – maba 2012-08-17 10:12:16

1

地圖可以被用作其中鍵代表條件和值表示要執行的命令的唯一缺點是對象被創建之前使用,因此如果有大量的這樣的條件,那麼你可以選擇地圖命令模式否則switch總是優雅的方法,如果你的條件很少。