在开始之前,我们来探讨一下,Java中的null究竟指什么?
例如,Map.get(key)返回Null时,可能表示map中的值是null,亦或map中没有key对应的值。
Null可以表示失败、成功或几乎任何情况。使用Null以外的特定值,会让你的逻辑描述变得更清晰。
鉴于此,在Guava中的大多数集合类都支持对null的快速失败操作。
为了尽量避免程序中的null值,Guava提供了Optional对数据进行封装。如果值为空则立即抛出异常,并且提供了Absent和Present两个子类分别表示值缺失和值存在的情形,来增强null的语义。
Guava Optional
创建Optional实例
为了创建Optional实例,Google给出了三种方法:
方法 | 语义 |
---|---|
Optional.of(T) | 创建指定引用的Optional实例,若引用为null则快速失败 |
Optional.absent() | 创建引用缺失的Optional实例 |
Optional.fromNullable(T) | 创建指定引用的Optional实例,若引用为null则表示缺失 |
下面分别来看看这三种创建实例方法的源码:
- of方法
复制代码
1
2
3
4public static <T> Optional<T> of(T reference) { return new Present<T>(checkNotNull(reference)); }
传入引用后,返回了一个Present实例,并调用checkNotNull方法,在子类Present中如下:
复制代码
1
2
3
4
5
6
7public static <T> T checkNotNull(@CheckForNull T reference) { if (reference == null) { throw new NullPointerException(); } return reference; }
若引用为null则抛出空指针异常,因此of方法不可以传入null,否则将快速失败。
- absent方法
复制代码
1
2
3
4public static <T> Optional<T> absent() { return Absent.withType(); }
复制代码
1
2
3
4
5
6
7static final Absent<Object> INSTANCE = new Absent<>(); @SuppressWarnings("unchecked") // implementation is "fully variant" static <T> Optional<T> withType() { return (Optional<T>) INSTANCE; }
创建一个Absent实例。
- fullNullable方法
复制代码
1
2
3
4public static <T> Optional<T> fromNullable(@CheckForNull T nullableReference) { return (nullableReference == null) ? Optional.<T>absent() : new Present<T>(nullableReference); }
该方法传入引用为null时创建Absent实例,否则创建Present实例。
最后
以上就是舒适宝贝最近收集整理的关于Guava 源码解读 -- Optional的全部内容,更多相关Guava内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复