简介
Optional是用来处理java中的null,在评审代码的时候,经常听到:“如果返回null的话,你这就报错了”。下面说一下使用null的好处,坏处,怎么使用null以及在guava中怎么使用null
关于null
null的坏处
null含义是模糊的,看这个例子:
Map<String,String> map=Maps.newHashMap();//使用Maps创建了一个hashmap
map.put("a",null);
System.out.println(map.get("a")); // 输出 null
System.out.println(map.get("b")); //输出 null
调用map的get方法,如果返回null,有两种情况:
1、key存在,值为null
2、key本身就不存在
如果一个方法的返回值是null,其实可以代表任何含义,成功、失败、或者其他什么含义。之所以可能代表这些含义,主要还是null本身没有意义,不同的程序员写不同的方法的时候返回值为null,可能代表的含义就不一样。null好处
null是廉价的:性能比较好
处理null的方法
空对象模式
自己明确定义一个类的实例,用来表示这个类的空实例。
public class Order {
public static final NULL=new Order();
}
if (order == null) {
return Order.NULL;
}
快速失败
遇到null的时候,就抛出异常,这个也是guava中集合相关的95%类采用的策略。
if (order == null) {
throw new RuntimeException();
}
Optional
Optional是guava对null的一种处理方式。
Optional示例代码,返回一个包含数字5的Optional实例。
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5
如果一个方法返回Optional感觉没什么用,还比原来复杂了。为什么要用Optional把返回的值包装一个下呢。
对于方法调用者:看到一个方法的返回值为Optional,就会意识到返回值有可能不存在(null)。从而来积极的处理不存在的情况。
对于方法编写者:如果返回值可能为null,可以使用Optional给调用者一个提醒
我觉得在实际中我们应该尽可能不返回null或Optional。比如一个方法的返回值是一个集合,可以返回一个空集合。
因为就算返回Optional,也要调用isPresent(),和以前的if null差不多了就(虽然语义上有点不同)。
创建Optional实例的方法
方法 | 描述 |
Optional.of(T ref) | 如果T为null抛出异常,否者返回一个包含了ref的Optional实例 |
Optional.absent() | 返回一个缺席(不包含内容)的Optional |
Optional.fromNullable(T ref) | ref为null时返回absent(),非null时返回of(T ref) |
Optional的方法
方法 | 描述 |
boolean isPresent() | 如果Optional包含内容,返回true,否者返会false |
T get() | 返回包含的内容,如果Optional不包含内容,抛出IllegalStateException异常 |
T or(T ref) | 返回包含的内容,如果Optional不包含内容,返回ref |
T orNull() | 如果Optional包含内容,返回包含的内容。否者返会null。是fromNullable()的反向操作 |
Set<T> asSet() | 如果Optional包含内容,返会一个不可变的set(只包含一个元素) 如果Optional不包含内容,返回一个空的不可变的set |
参照:
1、《getting started with google guava》
2、https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained