写代码,一定要对自己写的(维护的)每一行代码都进行深入的研究。写程序本来就是一个很细致的活儿,粗心大意和自以为是的猜测都是在给后人或自己挖坑。
简单的一个布尔值装箱,都有可能是bug的根源。
Code review的时候,发现一段代码如下:
Boolean isNeedProxy = (Boolean)threadLocalMap.get(ip);
return ( isNeedProxy == Boolean.TRUE ) ? true : false;
我的猜想是编程的人为了防止isNeedProxy为null,所以有了这段代码。
这里有个问题。如果存储的值是new出来的Boolean,那么这里的逻辑就是错的。
发现了这个问题,改正起来当然是比较容易的。
本来故事到了这里就结束了,但是,仔细想想,对于这种比较细微的代码级别问题,别人一样是很容易犯错的。还是应该把这个细微的东西封装起来比较好。
代码如下:
简单的一个布尔值装箱,都有可能是bug的根源。
Code review的时候,发现一段代码如下:
Boolean isNeedProxy = (Boolean)threadLocalMap.get(ip);
return ( isNeedProxy == Boolean.TRUE ) ? true : false;
我的猜想是编程的人为了防止isNeedProxy为null,所以有了这段代码。
这里有个问题。如果存储的值是new出来的Boolean,那么这里的逻辑就是错的。
Boolean b = new Boolean("true");
Assert.assertFalse(b == Boolean.TRUE);
发现了这个问题,改正起来当然是比较容易的。
return isNeedProxy==null?false:isNeedProxy;
本来故事到了这里就结束了,但是,仔细想想,对于这种比较细微的代码级别问题,别人一样是很容易犯错的。还是应该把这个细微的东西封装起来比较好。
代码如下:
private Map<String, Boolean> map = new HashMap<String, Boolean>();
public void put(String key, boolean value) {
map.put(key, value);
}
public boolean getValue(String key) {
Boolean value = map.get(key);
if (value == null) {
return false;
}
return value.booleanValue();
}