Java8新特性系列-Optional有什么意义?

Java 8 中有一个称为 Optional 类的新功能,它应该可以解决 NullPointerExceptions。 显然,这些让开发人员感到恼火的程度比我想象的要多。 很明显,一个对象实际上只是一个指针,而指针可以指向任何东西。 也许不再是了? 也许本世纪大多数计算机科学专业的毕业生从未真正了解过指针,因为学校已经被高级编程语言所吸引。 在这一点上我并不批评,这就像问 90 年代计算机科学专业的学生为什么他们不知道 COBOL。

这个新的 Optional 类的亮点当然是”类”这个词。 Optional 只是一个包装器,它包含对其他对象的引用,并且不是 NullPointerExceptions 的灵丹妙药。

让我们从创建一个生成 NullPointerException 的非常简单的示例开始:

是的,toString() 是多余的,但它保证了 NullPointerException,这是我们试图演示的。 所以这是这个问题的可怕老派解决方案:

所以这里是可选的救援; 除了 Optional 是一个对象,因此它也可以为空:

好的,所以这可能不是该类的预期用途。 您应该使用像 Optional.of 这样的静态方法来创建实例。 如果传递了一个空值,这将抛出一个,你猜对了,NullPointerException。 因此,如果目标是避免 NullPointerExceptions,那么这种特定方法仅在您已经知道要分配非空值的情况下才有用,在这种情况下,为什么还需要 Optional? 例子:

因此,我们使用 Optional.ofNullable 来创建一个可能包含空值的 Optional 实例。 我们可以在 Optional 上调用 ifPresent 方法,而不是检查空引用的可怕负担:

optionalString=Optional.ofNullable(optionalTest.getNullString());
optionalString.ifPresent(s->{System.out.println(s.toString());});
我真的很困惑为什么这比这更可取:

String s=optionalTest.getNullString();
if(s!=null){System.out.println(s.toString());}
这个新的 Optional 类还有另外两个缺点:

1) 这是使堆管理和调试堆栈跟踪变得更糟的好方法。 同样,Optional 是一个包装器,这意味着如果您使用它,您现在将拥有两个以前拥有的对象引用。

2)它不是可序列化的,因此在许多情况下都无用。

所以回顾一下 – 为了摆脱 NullPointerExceptions 我们有一个新类:

抛出 NullPointerExceptions
本身可以为空,导致 NullPointerException
增加堆大小
使调试更加困难
使序列化对象(例如外部客户端的 XML 或 JSON)变得更加困难
====

在之前的一篇文章《Java8新特性系列-Optional有什么意义?》中,对Optional做了一些阐述,不是很明白这个类到底是为了解决什么问题而存在,原文是如下描述的

Optional is intended to provide a limited mechanism for library method return types where there needed to be a clear way to represent “no result,” and using null for such was overwhelmingly likely to cause errors.

意思是说,Optional 旨在为库里面方法返回类型提供一种有限制的机制,在需要一种明确的方式来表示”无结果”,并且使用 null 来表示这种情况极有可能导致错误的情况下使用最好。总结来说有以下几点

Optional 是用来作为方法返回值的
Optional 是为了明确地表达返回值中存在”无结果”的可能性
如果这个”无结果”通过返回 null来表示 很可能导致调用端产生错误(尤其是NullPointerException)
通过这样分析就能够理解到这个类的主要用途了

  1. 不应该把这个当做空指针判断的通用替代方案

  2. 应该在设计方法接口时针对返回值做出语义性的说明,来表示该方法存在”无结果”的可能

Original: https://www.cnblogs.com/luoaz/p/15978771.html
Author: 小爱博客
Title: Java8新特性系列-Optional有什么意义?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580226/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • go实现用户状态的锁定和解锁功能

    1、前端页面js代码传值 function changeLock(id) { var url = ‘{{ urlfor "BackendUserController.Ch…

    Java 2023年6月13日
    053
  • Spring Cloud 还没学明白,Istio 又是什么鬼??

    背景 过去,我们运维着”能做一切”的大型单体应用程序。这是一种将产品推向市场的很好的方式,因为刚开始我们也只需要让我们的第一个应用上线。 而且我们总是可以回…

    Java 2023年5月29日
    087
  • windows安装jdk8

    win10系统安装jdk8全过程 一 下载安装文件 jdk的安装与配置是Java学习的第一步,下面记录一下具体过程。首先根据自己系统下载对应版本。下载地址http://www.or…

    Java 2023年5月30日
    060
  • Prometheus 安装

    官方文档 https://prometheus.io/docs/introduction/first_steps/ 中文文档 https://prometheus.fuckclou…

    Java 2023年6月9日
    092
  • 计算机网络学习—物理层

    二、 物理层 2.1 物理层的基本概念 物理层所要解决的问题(⭐) 物理层考虑的是怎样才能 在连接各种计算机的传输媒体上传输数据比特流。 物理层 为数据链路层屏蔽了各种传输媒体的差…

    Java 2023年6月7日
    061
  • JAVA日期格式YYYY-MM-DD与yyyy-MM-dd的区别

    有下面一段代码: csharp;gutter:true; public static void main(String[] args) { DateTime date = new …

    Java 2023年5月29日
    071
  • Java基础 try…catch…catch 使用Exception,去捕获其子类异常

    JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code packag…

    Java 2023年5月29日
    075
  • 关于Java执行Cmd命令出现的死锁问题解决

    之前研究了Java通过执行cmd命令从而触发Android打包的思路,但是发现Android打包成功之后,后面的代码逻辑就不走了(连输出都没有) 经过了一天的排查,终于是从网上找到…

    Java 2023年6月14日
    069
  • ngnix+tomcat转发、负载均衡

    @ 前言 一、流程及图 + 1.简易流程图如下 一、nginx服务器配置: 1.下载并安装nginx 1.1 将下载好的nginx包传到服务器/usr/local/目录下 2.ng…

    Java 2023年6月13日
    086
  • 我怀疑这是IDEA的BUG,但是我翻遍全网没找到证据!

    你好呀,我是歪歪。 前几天有朋友给我发来这样的一个截图: 他说他不理解,为什么这样不报错。 我说我也不理解,把一个 boolean 类型赋值给 int 类型,怎么会不报错呢,并接着…

    Java 2023年6月5日
    070
  • launchMode(启动模式)

    默认启动模式,每次将创建一个新的实例。 如果该活动处于栈顶部,则不会新建实例,否则新建实例; 复用时会触发 onNewIntent 方法。 栈内唯一,只要栈中存在该实例,将被复用;…

    Java 2023年6月7日
    079
  • MyBatis架构与源码分析<资料收集>

    1、架构与源码分析 :https://www.cnblogs.com/luoxn28/p/6417892.html 、https://www.cnblogs.com/wangdai…

    Java 2023年5月30日
    059
  • 一文搞懂Kafka的基本原理及使用

    Kafka的基本原理及使用 一、基本概念及原理 1、Kafka特点 Kafka 是一个分布式的流式平台,流式平台包括以下三个特点: 发布和订阅消息(流),类似于一个消息队列或企业消…

    Java 2023年6月8日
    086
  • 单线程的Node.js是如何实现高并发的

    nodejs单进程单线程事件驱动 Node遵循的是单线程单进程的模式,node的单线程是指js的引擎只有一个实例,且在nodejs的主线程中执行,同时node以事件驱动的方式处理I…

    Java 2023年5月30日
    074
  • RabbitMQ的工作队列和路由

    工作队列:Working Queue 工作队列这个概念与简单的发送/接收消息的区别就是:接收方接收到消息后,可能需要花费更长的时间来处理消息,这个过程就叫一个Work/Task。 …

    Java 2023年5月30日
    055
  • 快速上手FastJSON

    作为一名后端开发而言肯定会接触数据,把数据提供给前端或者把数据存储起来,目前比较火热的传输格式是json,给前端传json是再常见不过啦,甚至是往db里面直接存入json。 在ja…

    Java 2023年6月5日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球