在编程中,估计null应该是一个很常写的词汇了。
实践中,经常看到大量类似user!=null或者userList!=null的检测。当然,这么做是为了防止NullPointerException。问题是,null这么常见,它究竟是什么意思。
观察如下一段code:
如果这里user==null的话,一般的看法应该是userService没有找到指定名字的User对象。
那么这个时候null的含义就是没有找到指定名字对应的User对象。
且慢,这段code也可以如下:
三处都是null,但是含义是各不相同的。当方法调用返回的时候,本来应该是一个有效的User对象,但是因为找不到满足条件的结果,只能返回一个null了事。
于是就有了这个意义混淆的问题,是因为java对于简单对象没有办法区分是没有初始化还是调用了方法返回了null。
但是,集合类对这个概念的混淆有着天生的抵抗力。
当一个集合类没有初始化的时候,用null。
当一个方法找不到满足条件的对象时,返回一个空的集合。
推论就是,大部分情况下,以集合类作为返回结果类型的方法应该返回非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对于调用方代码的编写也是有好处的,参见平铺直叙的代码小节。