guava Optional

简介

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值