`
zhang_xzhi_xjtu
  • 浏览: 524192 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实践中的重构04_了解每一行代码 装箱的布尔值(new)

阅读更多
写代码,一定要对自己写的(维护的)每一行代码都进行深入的研究。写程序本来就是一个很细致的活儿,粗心大意和自以为是的猜测都是在给后人或自己挖坑。
简单的一个布尔值装箱,都有可能是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();
	}
分享到:
评论
3 楼 joaboo 2012-05-17  
zhang_xzhi_xjtu 写道
抛出异常的爱 写道
   BooleanUtils.toBoolean(Boolean.TRUE)  = true
   BooleanUtils.toBoolean(Boolean.FALSE) = false
   BooleanUtils.toBoolean(null)          = false

   BooleanUtils.isTrue(Boolean.TRUE)  = true
   BooleanUtils.isTrue(Boolean.FALSE) = false
   BooleanUtils.isTrue(null)          = false


要看你的业务语义来决定用哪个.


对。

这里的语义是false.

这里主要强调的是对Boolean不能想当然的用==.



何必这么麻烦...
直接Boolean.TRUE.equals(isNeedProxy)不就完事了?
2 楼 zhang_xzhi_xjtu 2010-09-10  
抛出异常的爱 写道
   BooleanUtils.toBoolean(Boolean.TRUE)  = true
   BooleanUtils.toBoolean(Boolean.FALSE) = false
   BooleanUtils.toBoolean(null)          = false

   BooleanUtils.isTrue(Boolean.TRUE)  = true
   BooleanUtils.isTrue(Boolean.FALSE) = false
   BooleanUtils.isTrue(null)          = false


要看你的业务语义来决定用哪个.


对。

这里的语义是false.

这里主要强调的是对Boolean不能想当然的用==.
1 楼 抛出异常的爱 2010-09-10  
   BooleanUtils.toBoolean(Boolean.TRUE)  = true
   BooleanUtils.toBoolean(Boolean.FALSE) = false
   BooleanUtils.toBoolean(null)          = false

   BooleanUtils.isTrue(Boolean.TRUE)  = true
   BooleanUtils.isTrue(Boolean.FALSE) = false
   BooleanUtils.isTrue(null)          = false


要看你的业务语义来决定用哪个.

相关推荐

Global site tag (gtag.js) - Google Analytics