论坛首页 Java企业应用论坛

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

浏览 1483 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-10   最后修改:2011-06-06
写代码,一定要对自己写的(维护的)每一行代码都进行深入的研究。写程序本来就是一个很细致的活儿,粗心大意和自以为是的猜测都是在给后人或自己挖坑。
简单的一个布尔值装箱,都有可能是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();
	}
   发表时间:2010-09-10   最后修改: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


要看你的业务语义来决定用哪个.
0 请登录后投票
   发表时间:2010-09-10   最后修改: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不能想当然的用==.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics