[Guava源码日报](5)Optional分析
来源:互联网 发布:淘宝新手卖家讨论群 编辑:程序博客网 时间:2024/06/05 19:25
大多数情况下,开发人员使用null表明的是某种缺失情形:可能是已经有一个默认值,或没有值,或找不到值。例如,Map.get返回null就表示找不到给定键对应的值或者给定键对应值就是为null。
Guava用Optional表示可能为null的T类型引用。一个Optional实例可能包含非null的引用(我们称之为引用存在),也可能什么也不包括(称之为引用缺失)。它从不说包含的是null值,而是用存在或缺失来表示。但Optional从不会包含null值引用。
1. 主要方法
1.1 创建Optional实例 (静态方法)
1.2 使用Optional实例查询引用(非静态方法)
2. 使用意义
使用Optional除了赋予null语义,增加了可读性,最大的优点在于它是一种傻瓜式的防护。Optional迫使你积极思考引用缺失的情况,因为你必须显式地从Optional获取引用。直接使用null很容易让人忘掉某些情形。
如同输入参数,方法的返回值也可能是null。和其他人一样,你绝对很可能会忘记别人写的方法method(a,b)会返回一个null,就好像当你实现method(a,b)时,也很可能忘记输入参数a可以为null。将方法的返回类型指定为Optional,也可以迫使调用者思考返回的引用缺失的情形。
3. 类声明
4. 分析
4.1 Optional.of(T)
上面的程序,我们使用Optional.of(null)方法,这时候程序会第一时间抛出空指针异常,这可以帮助我们尽早发现问题。如果给定值不为null,则会返回给定值的Optional实例。
源码
首先使用checkNotNull来判断给定值是否为null,如果为null,则会抛出空指针异常,否则返回给定值的Optional的实例(Present是Optional的子类)。
4.2 Optional.absent()
上面的程序,我们使用Optional.absent()方法,创建引用缺失的Optional实例。 源码:
Absent是Optional的子类:
通过withType方法返回一个静态Absent对象,并强制转换为Optional对象。从上面就可以看出其中不包含任何的引用。
4.3 Optional.fromNullable(T)
创建指定引用的Optional实例,若引用为null则表示缺失,返回应用缺失对象Absent,否则返回引用存在对象Present。
源码:
从上面源码中可以看出如果T为null,则调用Optional静态方法absent(),表示引用缺失;如果T不为null,则创建一个Present对象,表示引用存在。
4.4 T get()
返回Optional包含的T实例,该T实例必须不为空;否则,对包含null的Optional实例调用get()会抛出一个IllegalStateException异常。
因为fromNullable对象根据给定值是否为null,返回不同的对象:
因此调用的get方法也将会不一样。
源码:
如果返回的是一个Present对象,将调用Present类中的get()方法:
如果返回的是一个Absent对象,将调用Absent类中的get()方法:
4.5 T or (T)
返回Optional所包含的引用,若引用缺失,返回指定的值。
因为fromNullable对象根据给定值是否为null,返回不同的对象:
因此调用的or方法也将会不一样。
源码:
(1)如果返回的是一个Present对象,将调用Present类中的or()方法:
这个方法首先对默认值进行判断,如果不为null,则返回引用;如果为null,抛出空指针异常,这种情况可以使用Optional.orNull()方法代替。
(2)如果返回的是一个Absent对象,将调用Absent类中的or()方法:
这个方法首先对默认值进行判断,如果不为null,则返回默认值;如果为null,抛出空指针异常,这种情况可以使用Optional.orNull()方法代替。
4.6 T orNull()
返回Optional所包含的引用,若引用缺失,返回null
因为fromNullable对象根据给定值是否为null,返回不同的对象:
因此调用的orNull方法也将会不一样。
源码:
(1)如果返回的是一个Present对象,将调用Present类中的orNull()方法:
引用存在,返回引用。
(2)如果返回的是一个Absent对象,将调用Absent类中的orNull()方法:
引用缺失,返回null,此时没有默认值。
参考文章:http://ifeve.com/google-guava-using-and-avoiding-null/
- [Guava源码日报](5)Optional分析
- [Guava源码日报](2)Strings分析
- [Guava源码日报](3)Joiner分析
- [Guava源码日报](7)Throwables分析
- [Guava源码日报](4)Preconditions
- [Guava源码日报](8)ImmutableCollection
- [Guava源码日报](9)Closeables
- [Guava源码日报](10)Iterables
- [Guava源码日报](11)BiMap
- [Guava源码日报]Guava类库简介
- guava Optional
- guava Optional
- [Guava源码分析](6)Objects分析
- Google Guava学习(1)-Guava Optional类
- guava学习(一)ComparisonChain 源码分析
- Optional源码分析和使用
- Guava之optional
- Guava之Optional
- 大众创业热度不减,好机友项目强势来袭
- rs.next() 只能调用一次
- Android.mk代码记录
- Linux-CentOS7 重置root密码
- Mybatis查询缓存机制
- [Guava源码日报](5)Optional分析
- Linux查找含有某字符串的所有文件
- Java文件路径分隔符
- Android开源项目库汇总
- 西加云杉700E设备AAA认证之Portal页面弹出
- 关于后台事件中(object sender, EventArgs e)说明
- 原生cookie写法
- HDU 2066 一个人的旅行 (单源最短路)
- Choices of the Gadgets