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

实践中的重构15_null的意义和集合类作为方法结果类型

阅读更多
在编程中,估计null应该是一个很常写的词汇了。
实践中,经常看到大量类似user!=null或者userList!=null的检测。当然,这么做是为了防止NullPointerException。问题是,null这么常见,它究竟是什么意思。
观察如下一段code:
		String userName = "allen";
		User user = userService.findUserByName(userName);

如果这里user==null的话,一般的看法应该是userService没有找到指定名字的User对象。
那么这个时候null的含义就是没有找到指定名字对应的User对象。
且慢,这段code也可以如下:
		String userName = "allen";
		String userId = "2011";
		// 这里的null代表该时刻user对象没有初始化。
		User user = null;
		// 这里的null代表该时刻userService没有找到对应指定名字的User对象。
		user = userService.findUserByName(userName);
		if (user == null) {
			// 如果这里为null,则表示userService没有找到对应指定id的User对象。
			user = userService.findUserById(userId);
		}


三处都是null,但是含义是各不相同的。当方法调用返回的时候,本来应该是一个有效的User对象,但是因为找不到满足条件的结果,只能返回一个null了事。
于是就有了这个意义混淆的问题,是因为java对于简单对象没有办法区分是没有初始化还是调用了方法返回了null。
但是,集合类对这个概念的混淆有着天生的抵抗力。
当一个集合类没有初始化的时候,用null。
当一个方法找不到满足条件的对象时,返回一个空的集合。
推论就是,大部分情况下,以集合类作为返回结果类型的方法应该返回非null的对象。另,方法接口保证不返回null对于调用方代码的编写也是有好处的,参见平铺直叙的代码小节。
分享到:
评论
2 楼 zhang_xzhi_xjtu 2011-01-12  
呵呵,这个的确没有什么好的办法。
billion dollar mistake,这个很贴切,当然,还有程序员写a!=null的时间,这个时间加起来不知道有多长了。
1 楼 liusong1111 2011-01-12  
也只能如此了。
引用
Tony Hoare, who introduced the concept of null in 1965, called his “billion dollar mistake”

引用
In Java, null is a keyword, not an object, and thus it’s illegal to call any methods on it. But this is a confusing choice on the language designer’s part. Why return a keyword when the programmer expects an object?

相关推荐

Global site tag (gtag.js) - Google Analytics