Guava 之 Optional

重构 · intonormal · 于 发布 · 1099 次阅读
41

Guava工程包含了若干被Google的 JAVA项目广泛依赖 的核心库,库的很多设计思想在JAVA8有所借鉴。Guava的github的地址是https://github.com/google/guava.git,可下载阅读

为什么有Option库

语言特性

JAVA中,变量的使用都遵循一个原则:先定义,并且初始化后,才可以使用。JAVA默认给变量赋值:在定义变量的时候,如果定义后没有给变量赋值,则JAVA在运行时会自动给变量赋值。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各供引用类型变量自动赋值为null。

带来问题

JAVA中,null是一个关键字,用来标识一个不确定的对象,他既不是对象,也不是Objcet对象的实例。在应用级别代码中,Null往往是导致混乱,疑难问题和模糊语义的元凶。比如Map.get(key)返回Null时,可能表示map中的值是null,亦或map中没有key对应的值。在没有Option库的情况下,只有在编写业务代码时通过判断语句进行分支处理来应对。此带来的问题主要是Null的含义统一较难且因判断较多导致增加代码复杂度,对代码的维护带来隐患。Show Me Code:

Option库如何实现

为解决上述问题,整体思路是把Null表达的各种情况进行区分,如果是无效值则抛出异常,如果是有效值则用约定值代替。具体而言,Guava用Optional<T>表示可能为null的T类型引用。一个Optional实例可能包含非null的引用(我们称之为引用存在),也可能什么也不包括(称之为引用缺失)。它从不说包含的是null值,而是用存在或缺失来表示。但Optional从不会包含null值引用,具体可以查看代码。上述例子,使用optional的写法如下:

接口说明

静态方法,主要用于创建实例

接口名 功能说明
Optional.of(T) 创建指定引用的Optional实例,若引用为null则快速失败
Optional.absent() 创建引用缺失的Optional实例
Optional.fromNullable(T) 创建指定引用的Optional实例,若引用为null则表示缺失

非静态方法,主要用于实例查询

接口名 功能说明
boolean isPresent() 如果Optional包含非null的引用(引用存在),返回true
T get() 返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException
T or(T) 返回Optional所包含的引用,若引用缺失,返回指定的值
T orNull() 返回Optional所包含的引用,若引用缺失,返回null
Set<T> asSet() 返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。

实现亮点举例:

  • 接口对外使用时,采用基类的静态方法获取子类对象,示例代码如下:

  • 接口内部实现时,
    • 基类包含实现静态发放来获取子类对象,示例代码如下:

  • 子类对象继承基类,同时new静态对象并且实现获取子类对象的静态方法,示例代码如下:

总结

Optional<T>的最常用价值在于,例如,假设一个方法返回某一个数据类型,调用这个方法的代码来根据这个方法的返回值来做下一步的动作,若该方法可以返回一个null值表示成功,或者表示失败,在这里看来都是意义含糊的,所以使用Optional<T>作为返回值,则后续代码可以通过isPresent()来判断是否返回了期望的值(原本期望返回null或者返回不为null,其意义不清晰),并且可以使用get()来获得实际的返回值。


「软件匠艺社区」旨在传播匠艺精神,通过分享好的「工作方式」和「习惯」以帮助程序员更加快乐高效地编程。
暂无回复。
需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。
相关话题
3
重构horance • 最后由 uxyheaven回复
2
3
horance • 最后由 leomustafa回复
5
3
horance • 最后由 sidan001回复
1