Maven Pom:
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
ImmutableMap 的作用就是:可以让java代码也能够创建一个对象常量映射,来保存一些常量映射的键值对。
分析以下情景,来具体讨论这个的好处。
以下是在js前台的代码,假设现在有需求如下:
根据数据库存的某个key字段,来获得不同的提示名字。
有以下3种处理方法:
- 用 多个 if else 语句,只要新添加个字段,你就得添加个 if else 差评
- 用 switch case 语句,只要新添加个字段,你就得添加个 case 差评
- 用 对象映射 方法,如下所示。 新建字段,只需要添加一行就好 好评
下面比较几种实现方法的:
1.if else 语句和switch case 是一个水平的东西
function getDevName(assetSubType){
switch(assetSubType){
case "router":
assetSubType = "路由器";
break;
case "switchboard":
assetSubType = "交换机";
break;
case "virtualMac":
assetSubType = "虚拟机";
break;
case "physicalMac":
assetSubType = "物理机";
break;
case "firewall":
assetSubType = "防火墙";
break;
case "secretMac":
assetSubType = "加密机";
break;
case "storage":
assetSubType = "存储";
break;
case "host":
assetSubType = "主机";
break;
case "safetyEq":
assetSubType = "安全设备";
break;
case "other":
assetSubType = "其它";
break;
default:
assetSubType = assetSubType;
}
return assetSubType;
}
然后在其他地方调用的时候,具体调用:
getDevName(assetSubType);
看,是不是很麻烦,现在想要增加一个,你还得继续修改代码,添加一对 if else 或者 switch case。
2.我们换成对象试试,然后以key value的形式去获得值
var assetSubTypeKeyValueMap = {
"router": "路由器",
"switchboard": "交换机",
"virtualMac": "虚拟机",
"physicalMac": "物理机",
"firewall": "防火墙",
"secretMac": "加密机",
"storage": "存储",
"host": "主机",
"safetyEq": "安全设备",
"other": "其它"
};
然后再看这个的调用方式:
function getSubTypeName(assetSubType) {
return assetSubTypeKeyValueMap[assetSubType];
}
这样简单吧,现在新增加一对,只需要修改这个js对象就可以。
当你写代码的时候,这两个方式都可以实现,如果你是工作几年了,还是跟上面的第一种写法一样,只会if else,switch case,自身的水品相对一般,平时搬搬砖,没有太多的成长。
如果你一开始开始就按照第二种这么写,那么你代码会很整洁,同事之间觉得你还是可以的。
【忠告】工作中,请不要说:只要功能实现了就可以,这种傻话了。举例:
“这个坑我处理不了,重新做吧!”
“开发时间紧迫,先这样以后再说!”
“用这个技术太麻烦,还要去了解学习!”
要是都这么干的话,性能、可读性、维护成本未来会有很多问题,是否思考下“那些牛逼的人,为什么就那么牛呢?”
再看个类似的例子:
var inputDefObj = {
30: "IP地址或地址段",
31: "端口号或范围",
32: "IP地址或地址段",
33: "端口号或范围",
34: "代码值",
38: "探针名称",
39: "网络协议号(protocol)",
40: "ipv6源IP(ipv6_src_addr)",
41: "ipv6目标IP(ipv6_dst_addr)",
42: "网络协议名称(protocol_map)",
43: "输入接口snmp(input_snmp)",
};
//具体用法:
inputDefault.prop("placeholder", inputDefObj[key]);//key即为前面的数字,以此来获得后面的提示语。
js里面可以很简单的以key,value的形式建立常量对象,然后可以很方便的用key,得到value。
我们看下java的map也是可以的,请看实例:
package com.fm.client;
import com.google.common.collect.ImmutableMap;
import org.junit.Test;
import java.util.Map;
/**
* 定义一些常量map<?,?>
*
* <p>ImmutableMap.Builder
*/
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();
}
/**
* ImmutableMap测试实例
*
* @author vian mailto:716517@qq.com
* @create 2017-11-22 上午11:48
*/
public class ImmutableMapTest {
/** 测试 guava ImmutableMap */
@Test
public void immutalbeMapTests() {
Integer key = 39;
System.out.print("key = " + key + "的提示语是:" + ConstantMap.INTEGER_STRING_MAP.get(key));
}
}
我们看下输出结果:
具体感受只有用了才知道,希望大家在编程思想上的更多的进步吧。