14

一些 Message 类能够根据标签号返回标签名称

由于这个类被实例化了很多次,我有点不愿意为每个实例创建一个 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?

4

5 回答 5

6

MAP在静态块中初始化。

而且由于您将创建许多 Message 对象。您应该编写这样的代码

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);
  }
}
于 2012-08-17T09:54:28.557 回答
1

Map 可以用作命令模式,其中键代表条件,值代表要执行的命令,唯一的缺点是对象在使用之前创建,所以如果你有大量这样的条件,那么你可以选择 map elseswitch总是优雅的方法,如果你条件很少。

于 2012-08-17T10:06:02.597 回答
0

取决于你需要什么。例如,如果您曾经需要使用 a 获取所有标签名称以进行显示,那么您Map将得到回报。此外,如果您用 a 替换,TreeMap您可以对它们进行排序。
如果您没有这样的需求,那么使用 aMap将是一种开销,并且您的方法或 anEnum会更有效(尽管您的可读性低于 5-10-20 选项的case选项)

于 2012-08-17T09:50:51.177 回答
0

为什么不将 getTagName 方法设为静态并从属性文件中延迟加载呢?

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

无需重新编译即可轻松测试和配置。

于 2012-08-17T09:55:00.940 回答
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];
    }
}
于 2012-08-17T09:58:50.343 回答