Java 硬编码开关与哈希映射

2022-09-04 04:19:46

某些 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吗?


答案 1

在静态块中初始化。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);
  }
}

答案 2

Map可以用作命令模式,其中键表示条件,值表示要执行的命令,唯一的缺点是在使用之前创建对象,因此,如果您有大量此类条件,则可以选择map,否则如果您的条件很少,则始终是优雅的方法。switch


推荐