Guava相关的介绍
Guava工程包含了许多被Google的Java项目广泛依赖的核心库。我们希望通过本文档为Guava中最流行和最强大的功能提供更具可读性和解释性的说明。
本教程是中级教程,适合 Guava 中级开发者的进阶学习。
学习Guava前的准备工作
-
学习目标和计划:在学习Guava技术之前,您需要明确自己的学习目标和计划。例如,您希望学习Guava的哪些功能,需要掌握哪些知识点,以及在什么时间内完成学习任务等。
-
学习工具:为了更好地学习Guava技术,您需要选择适合自己的学习工具。例如,您可以使用Eclipse、IntelliJ IDEA等集成开发环境(IDE)来编写和调试Java代码,使用Maven或Gradle等构建工具来管理项目依赖。
-
参考资料:在学习Guava技术之前,您需要收集相关的学习资料。例如,您可以阅读Guava官方文档、参考书籍、博客文章、视频教程等。
使用Guava工具的实战意义
很多 Guava 工具类对 Null 值都采用快速失败操作,除非工具类本身提供了针对 Null 值的因变措施。此外,Guava 还提供了很多工具类,让你更方便地用特定值替换 Null 值。
使用Optional除了赋予null 语义,增加了可读性,最大的优点在于它是一种傻瓜式的防护。Optional 迫使你积极思考引用缺失的情况,因为你必须显式地从 Optional 获取引用。直接使用 null 很容易让人忘掉某些情形,尽管 FindBugs 可以帮助查找 null 相关的问题,但是我们还是认为它并不能准确地定位问题根源。
使用Optional 的意义在哪儿?
使用Optional的最大优点是除了赋予null语义,还增加了代码的可读性。此外,它还是一种傻瓜式的防护,因为Optional迫使你积极思考引用缺失的情况,你必须显式地从Optional获取引用。相比之下,直接使用null很容易让人忘掉某些情形,尽管FindBugs等工具可以帮助查找null相关的问题,但它们并不能准确地定位问题根源。
在方法的返回值中,也可能存在null的情况。就像你自己实现的方法method(a,b)可能会返回null一样,其他人编写的方法也可能会返回null。为了避免这种情况,我们可以将方法的返回类型指定为Optional,这样就可以迫使调用者思考返回的引用缺失的情形。这样一来,你就不会忘记别人写的方法method(a,b)会返回null,就像你自己实现method(a,b)时可能会忘记输入参数a可以为null一样。
具体案例
建议您在使用Set时避免使用null,或者将null作为Map的键值。使用特殊值来代表null可以让查找操作的语义更加清晰。如果您想在Map中使用null作为某个键的值,建议您不要将这个条目放到Map中,而是单独维护一个"值为null的键集合"(null keys)。在Map中,对应某个键的值是null和没有对应某个键的值是非常容易混淆的两种情况。因此,最好将值为null的键分离开,并且仔细思考null值的键在您的项目中到底表达了什么语义。
如果您需要在列表中使用null,并且这个列表的数据是稀疏的,建议您使用Map<Integer, E>,这可能会更高效,并且更准确地符合您的潜在需求。
此外,建议您考虑使用自然的null对象——特殊值。例如,为某个枚举类型增加特殊的枚举值表示null,比如java.math.RoundingMode中定义的枚举值UNNECESSARY,它表示一种不做任何舍入操作的模式,使用这种模式进行舍入操作会直接抛出异常。
使用更优秀的集合功能
如果您真的需要使用null值,但是null值不能与Guava中的集合实现一起工作,那么建议您选择其他实现。例如,您可以使用JDK中的Collections.unmodifiableList来替代Guava的ImmutableList。
Optional的使用介绍
大多数情况下,开发人员使用 null 表明的是某种缺失情形:可能是已经有一个默认值,或没有值,或找不到值。例如,Map.get 返回 null 就表示找不到给定键对应的值。
Optional的引用类型
Guava用Optional表示可能为 null 的 T 类型引用。
一个Optional 实例可能包含非 null 的引用(我们称之为引用存在),也可能什么也不包括(称之为引用缺失)。它从不说包含的是 null 值,而是用存在或缺失来表示。但Optional 从不会包含 null 值引用。
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5
Optional无意直接模拟其他编程环境中的”可选” or “可能”语义,但它们的确有相似之处。Optional 最常用的一些操作被罗列如下:
创建 Optional 实例(静态方法)
- Optional.of(T) :创建指定引用的 Optional 实例,若引用为 null 则快速失败。
- Optional.absent():创建引用缺失的 Optional 实例。
- Optional.fromNullable(T):创建指定引用的 Optional 实例,若引用为 null 则表示缺失。
Optional实例查询引用(非静态方法)
- boolean isPresent():如果 Optional 包含非 null 的引用(引用存在),返回true
- T get():返回Optional包含的引用,若引用缺失,则抛出 java.lang.IllegalStateException
- T or(T):返回Optional包含的引用,若引用缺失,返回指定的值。
- T orNull():返回Optional所包含的引用,若引用缺失,返回 null
- Set asSet():返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。