ImmutableMap 的作用就是:可以让java代码也能够创建一个对象常量映射,来保存一些常量映射的键值对。
分析以下情景,来具体讨论这个的好处。
假设现在有需求如下:
根据数据库存的某个key字段,来获得不同的提示名字。有以下3种处理方法
1:用 多个 if else 语句,只要新添加个字段,你就得添加个 if else ,差评
2:用 switch case 语句,只要新添加个字段,你就得添加个 case ,差评
3:用 对象映射 方法,如下所示。 新建字段,只需要添加一行就好 ,好评
工作中用枚举类蛮多的
public enum ResourceEnum {
PHY_MACHINE((byte)1, "ph_machine", "实体机"), //
VI_MACHINE((byte)2, "vi_machine", "虚拟机"), //
REDIS((byte)3, "redis", "REDIS"), //
KAFKA((byte)4, "kafka", "KAFKA"), //
SWITCH((byte)5, "switch", "交换机"), //
ROUTE((byte)6, "route", "路由器"),//
ORACLE((byte)7, "oracle", "ORACLE"), //
MYSQL((byte)8, "mysql", "MYSQL"), //
NGINX((byte)9, "nginx", "NGINX"), //
IPS((byte)10, "ips", "IPS"), //
TOMCAT((byte)11, "tomcat", "TOMCAT"), //
VIPS((byte)12, "vips", "VIPS");
ResourceEnum(Byte type, String name, String remark) {
this.type = type;
this.name = name;
this.remark = remark;
}
private Byte type;
private String name;
private String remark;
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Byte getType() {
return type;
}
public void setType(Byte type) {
this.type = type;
}
public static String getNameByType(Byte type) {
if (null == type) {
return null;
}
for (ResourceEnum temp : ResourceEnum.values()) {
if (temp.getType().equals(type)) {
return temp.getName();
}
}
return "未知";
}
public static List<String> getAllNames() {
List<String> allNames = new ArrayList<>();
for (ResourceEnum temp : ResourceEnum.values()) {
allNames.add(temp.getName());
}
return allNames;
}
public static Map<Byte, Object> getResultMap() {
Map<Byte, Object> resultMap = new HashMap<>();
for (ResourceEnum temp : ResourceEnum.values()) {
resultMap.put(temp.getType(),temp.getRemark());
}
return resultMap;
}
但是今天发现更有趣的使用方式,使用map
interface ConstantMap {
Map<Integer, String> INTEGER_STRING_MAP =
new ImmutableMap.Builder<Integer, String>().
put(30, "IP地址或地址段").
put(31, "端口号或范围").
put(32, "IP地址或地址段").
put(33, "端口号或范围").
put(34, "代码值").
put(38, "探针名称").
put(39, "网络协议号(protocol)").
put(40, "ipv6源IP(ipv6_src_addr)").
put(41, "ipv6目标IP(ipv6_dst_addr)").
put(42, "网络协议名称(protocol_map)").
put(43, "输入接口snmp(input_snmp)")
.build();