最近运气好,技术栈正好和项目组相同,靠着坚挺的人品拿着组里面最低一级工资进了一家大公司。大公司项目就是比以前待过小公司先进和规范。用了大量的java8新特性还有一套完整的架构。刚进来一周开始熟悉项目,大量没有用过的类和注解就整的我头有点痛,只有从零开始一点点的把这些东西都整理好了。
Optional类是从java8开始使用的一个新类,在我看来是为了优雅的处理NPE异常。
他和单例模式中的饿汉模式很想。他在我们想要的对象外面套了一层壳,我们的对象实际上是放在
private final T value;
这个里面的value字段中的
一.他将无参构造方法私有化,不允许我们直接调用无参构造方法创建一个空的Optional对象,如果想要一个Value字段值为空的Optional对象,他提供了empty()方法
私有化的构造方法
private Optional() {
this.value = null;
}
返回的是一个value字段为空的Optional对象
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
二. 私有化其有参构造方法不允许直接创建,然后利用Object类的requireNonNull方法不允许传入的参数为null,
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
他的有参构造方法也是把值放进了value字段中。由于requireNonNull方法导致当传入的参数为null时会直接抛出NPE异常
同无参构造方法一样,我们也不能通过有参构造方法直接new出一个Optional对象
2.1.通过of()方法或ofNullable()方法返回一个Optioal对象
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
一眼可以看出ofNullable方法是通过调用of方法创建的Optional对象,区别在于of方法是直接调用的有参构造,当传入值为null是就抛出NPE异常,ofNullable方法当传入值为null时会调用empty方法创建一个value字段值为null的Optional对象
三.自带的get方法返回的也是value字段的值,如果value字段值为空那么抛出异常
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
3.1还另外提供了一个isPresent方法判断value的值是否为空
public boolean isPresent() {
return value != null;
}
Optional剩下的方法就涉及到java8的其他新特性了,比如通过函数式接口Consumer的函数式编程,这方面我实际上也没用过,只看过别人写的demo,了解的感觉不够深入,欢迎有大神给链接让我学习下,我也会尽快学习更多的知识完成Optional类剩下方法的分析。