Guava源码学习(一)Optional
基于版本:Guava 22.0
0:Optional简介
null在很多场景下会引发问题,NullPointerException困扰过无数的程序员,Guava用快速失败的思路来显式的解决null问题
ps:JDK1.8也提供了Optional工具包
1. 类图

2. 设计思路
抽象类Optional有两个子类Absent与Present,Optional本身不保存对象,这两个子类才是对象的容器
Absent表示值为null的情况
Present表示值不为null的情况
如果对Absent调用get方法,则会直接抛出IllegalStateException异常
用这样的手段,Optional显式的解决了null问题
3. 构造方法
Optional与它的两个子类的构造器都是私有的,只能通过Optional的几个方法来构造对象
Optional.absent()
public static <T> Optional<T> absent() {
return Absent.withType();
} Absent.withType()
static final Absent<Object> INSTANCE = new Absent<Object>(); @SuppressWarnings("unchecked") // implementation is "fully variant"
static <T> Optional<T> withType() {
return (Optional<T>) INSTANCE;
}
可以很清楚的看出,Optional.absent方法只是返回Absent内置的一个标记对象罢了
Optional.of()
public static <T> Optional<T> of(T reference) {
return new Present<T>(checkNotNull(reference));
} Optional.checkNotNull
@CanIgnoreReturnValue
public static <T> T checkNotNull(T reference) {
if (reference == null) {
throw new NullPointerException();
}
return reference;
} Present()
private final T reference; Present(T reference) {
this.reference = reference;
}
Optional.of方法会先对传入的参数进行校验,null会引发异常,不为null的话才会用Present进行包装
public static <T> Optional<T> fromNullable(@Nullable T nullableReference) {
return (nullableReference == null)
? Optional.<T>absent()
: new Present<T>(nullableReference);
}
Optional.fromNullable方法,如果传入值是null,会返回Absent,否则返回包装后的Present对象
4. get方法
Optional.get()
public abstract T get(); Absent.get()
@Override
public T get() {
throw new IllegalStateException("Optional.get() cannot be called on an absent value");
}
Present.get()
@Override
public T get() {
return reference;
}
Optional的get方法是抽象的,具体实现在子类中完成
Absent.get方法会直接抛出异常
Present.get方法会返回内部保存的值
由此实现了在value为null时,调用get方法会快速失败的语义
5. or方法
Optional.or()
public abstract T or(T defaultValue); Absent.or()
@Override
public T or(T defaultValue) {
return checkNotNull(defaultValue, "use Optional.orNull() instead of Optional.or(null)");
} Present.or()
@Override
public T or(T defaultValue) {
checkNotNull(defaultValue, "use Optional.orNull() instead of Optional.or(null)");
return reference;
}
跟get方法相同的套路,相当于一个在value为null的时候返回默认值的get方法
6.orNull方法
Optional.orNull()
@Nullable
public abstract T orNull(); Absent.orNull()
@Override
@Nullable
public T orNull() {
return null;
} Present.orNull()
@Override
public T orNull() {
return reference;
}
同上,相当于一个在value为null时就返回null的get方法
7. 总结
Optional是一个很简单但又很实用的工具类,其设计模式是很值得我们学习的
Guava源码学习(一)Optional的更多相关文章
- Guava源码学习(五)EventBus
基于版本:Guava 22.0 Wiki:EventBus 0. EventBus简介 提供了发布-订阅模型,可以方便的在EventBus上注册订阅者,发布者可以简单的将事件传递给EventBus,E ...
- Guava源码学习(二)Ordering
基于版本:Guava 22.0 Wiki:Ordering 0. Ordering简介 Guava的Ordering提供了链式风格的比较器的实现,我们可以用Ordering轻松构建复杂的比较器. 1. ...
- Guava源码学习(零)前言
Guava是由Google出品的Java类库,功能强大且易用. 后续我会用多篇博客介绍Guava的使用方法,以及从源码层面分析其实现原理. 分析次序基于Guava的官方Wiki 基于版本:Guava ...
- Guava源码学习(三)ImmutableCollection
基于版本:Guava 22.0 Wiki:Immutable collections 0. ImmutableCollection简介 类似于JDK的Collections.unmodifiableX ...
- Guava源码学习(四)新集合类型
基于版本:Guava 22.0 Wiki:New collection types 0. 简介 Guava提供了很多好用的集合工具,比如Multiset和BiMap,本文介绍了这些新集合类型的使用方式 ...
- caffe源码学习之Proto数据格式【1】
前言: 由于业务需要,接触caffe已经有接近半年,一直忙着阅读各种论文,重现大大小小的模型. 期间也总结过一些caffe源码学习笔记,断断续续,这次打算系统的记录一下caffe源码学习笔记,巩固一下 ...
- Aspects 源码学习
AOP 面向切面编程,在对于埋点.日志记录等操作来说是一个很好的解决方案.而 Aspects 是一个对于AOP编程的一个优雅的实现,也可以直接借助这个库来使用AOP思想.需要值得注意的是,Aspect ...
- Guava 源码分析(Cache 原理 对象引用、事件回调)
前言 在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理. 文末提到了回收机制.移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析. 在开 ...
- mongo源码学习(三)请求接收传输层
在上一篇博客中(mongo源码学习(二)db.cpp之mongoDbMain方法分析),我们把db.cpp中的mongoDbMain的执行过程分析了一下,最后会调用initAndListen(serv ...
随机推荐
- dubbo本地搭建实例
项目文件下载地址:http://download.csdn.net/detail/aqsunkai/9552711 概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服 ...
- 【Spiral Matrix】cpp
题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...
- SDK支付流程
1.普通支付流程 2.代理流程 易接.U8SDK
- AppCan试用体验
最近自己想开发一个基于Android平台的小应用,但不想使用JAVA开发,还要快速实现功能,学习成本低. 所以找了很多框架,最后基本锁定在phoneGap和AppCan,又看了AppCan与phone ...
- 【Android】Android中期项目设计题目-界面设计小作业-提交截止时间2016.4.8
评选三份作品,请发关于app运行界面截图的博客.
- 【转】PHP对象在内存中的分配
对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上 说大体上是分为4 段,栈空间段.堆空 ...
- codeforces ice cave
/// /// 题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎 /// DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了:2. ...
- 《c程序设计语言》-2.6~2.8
#include <stdio.h> unsigned setbits(unsigned x, int p, int n, unsigned y) { return (x & (( ...
- poj 3648 Wedding 2-SAT问题入门题目
Description Up to thirty couples will attend a wedding feast, at which they will be seated on either ...
- es6+最佳入门实践(4)
4.函数扩展 4.1.参数默认值 默认参数就是当用户没有传值的时候函数内部默认使用的值,在es5中我们通过逻辑运算符||来实现 function Fn(a, b) { b = b || "n ...