美文网首页
为什么Java8中的Optional类是final的

为什么Java8中的Optional类是final的

作者: 断臂残猿 | 来源:发表于2018-08-03 16:12 被阅读0次

Java8的Optional类给我们发日常开发中规避null判断提供了极大便利,现在我的代码中已经几乎很少使用if (sth == null)的写法,基本都用Optional.ofNullable(sth)了。

但是如果使用过程中感觉Optional的API不够用怎么办?
比如我想实现这样的效果:

                if (sth == null) {
                    throw new Exception();
                } else {
                    doSth();
                }

Optinal提供了ifPresent来执行非空时的操作,但是没有提供类似ifNotPresent的操作符。那该怎么办呢?总不能这样写吧:

                    if (opt.isPresent()) {
                        doSth(opt.get());
                    } else {
                        throw new Exception();
                    }

太不伦不类了,不是纯粹的函数式编程。

Java9给Optional类添加了一个方法

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
    if (value != null) {
        action.accept(value);
    } else {
        emptyAction.run();
    }
}
比如jdk自带的模块分析器中有这样的代码:

找到模块就add,否则log。

所以自然而然的想到模仿这个方法,自定义一下Optional类。
可是回头一看:Optional类是申明为final的!!没法继承啊!

为什么呢?
因为像Optional类和LocalDateTime类都是值敏感的。jdk要求把值敏感的类设计成不可变类,否则对象就可以被变更。

值敏感类一般有这么几个特征要求:

  • 申明为final
  • 根据值来自定义equals()hashCode()
  • 绝对使用equals()方法而不是==进行比较
  • 没有公开的构造器,而是提供工厂方法

如果值敏感却可以继承,我们就可以写出这样的代码:

public static void main(String[] args) {
    System.out.println(OptionalNotFinal.of(3).b);
    System.out.println(MyOptional.of(3).set(5).b);
}

private static class OptionalNotFinal {
    private final int b;

    private OptionalNotFinal(){
        b = 0;
    }

    private OptionalNotFinal(int b) {
        this.b = b;
    }

    public static OptionalNotFinal of(int b) {
        return new OptionalNotFinal(b);
    }
}

private static class MyOptional extends OptionalNotFinal {
    private int b;

    private MyOptional(){
        b = 0;
    }

    private MyOptional(int b) {
        this.b = b;
    }

    public static MyOptional of(int b) {
        return new MyOptional(b);
    }

    public MyOptional set(int b) {
        this.b = b;
        return this;
    }
}

显然已经偏离了该类的初衷。

相关文章

  • 为什么Java8中的Optional类是final的

    Java8的Optional类给我们发日常开发中规避null判断提供了极大便利,现在我的代码中已经几乎很少使用if...

  • Optional类

    Optional类为Java8新引入的一个类,Optional是一个可以为null的容器对象,Optional中的...

  • Optional

    Java8中Optional为util包中一个类 创建Optional对象 Optional.of() 传入对象不...

  • 深入JDK中的Optional

    概述:Optional最早是Google公司Guava中的概念,代表的是可选值。Optional类从Java8版本...

  • Optional源码分析(未完)

    Optional源码分析(未完) Optional 类是Java8的新特性,Optional是一个可以为null的...

  • 【java8新特性 简述】Optional

    Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引...

  • JAVA8新特性-Optional类解决NPE问题

    ** JAVA8新特性-Optional类解决NPE问题** API介绍 1、Optional(T value),...

  • 一起来学Java8(六)——Optional

    Optional类是Java8新增的一个类,其作用可以有效避免空指针异常。 Optional类的代码比较简单,很容...

  • 学习Optional 类

    1.介绍 Optional类是Java8为了解决null值判断问题,,使用Optional类可以避免显式的null...

  • Java8的Optional类

    今天讲解一下java8的Optional类:以前只知道Optional类是用来解决空指针异常的,并且只知道isPr...

网友评论

      本文标题:为什么Java8中的Optional类是final的

      本文链接:https://www.haomeiwen.com/subject/ycgyvftx.html