从方法返回Java 8的可选项时的注意事项

Java 8引入的Optional类一直是该语言版本引入的最具争议的功能之一。 尽管我喜欢这个新的Java类的东西比不喜欢的东西多,但在Java方法中将其用作return类型时,需要考虑一些事情。 我将在本文中讨论其中的一些问题,但不会讨论有关是否应该将Optional限制为用作返回类型的争论 。 我还假定Optional仅在期望在某些情况下该方法不应该返回任何值时才用作返回类型。 最后,这些观察结果适用于其他类型,并且也直接在Java中使用null ,但是Optional强调并具体说明了这些观察结果。

单一收益与多重收益

在一般的软件开发社区和Java开发社区中,有一段时间一直在争论(“ 宗教战争 ”)关于是否应该编写方法仅return一次(在本次讨论中不计入抛出异常 )的争论。 一方面, Yegor Bugayenko认为“ 许多返回语句在OOP中不是一个好主意 ”, Tom Dalling认为“ 从函数中获得一个退出点(返回)是一件好事 ”,而且许多人认为经常有多个return语句表示需要重构该方法 。 另一方面, 布鲁斯·埃克尔(Bruce Eckel)认为 ,多个return语句可使代码更“清晰”, 泰勒·高铁 ( Taylor Gautier)认为,“ 格言(Maxim) ”“一种方法应该只有一个出口点”“不会再错了”, 彼得Ritchie认为, 严格遵守单出口,如今会导致“面向对象的语言”中的“可读性较低”的代码,而Mark Levison概述了“ 一些我不喜欢单出口论点的原因 。”

Nicolai Parlog在“ 多重返回语句 ”一文中 ,介绍了方法仅返回一次的想法的历史以及需要考虑的事项。 他包括“多重收益表的情况”一节,其中概述了“一种方法可以从多个收益表中获利的几种情况。” 我最好的猜测是,许多开发商觉得我做的方式,这是“这取决于”决定一个特定的方法是否应该只有一个的时候return陈述或应该有一个以上的return声明。

当我开始更频繁地将Java 8的Optional用于我的方法的返回类型时,我发现在确定是从方法中返回一次还是多次时,还需要考虑使用Optional作为返回类型。

在声明Java方法返回Optional ,重要的是要充分理解这并不妨碍编写此方法的开发人员返回null 。 返回的Optional是引用类型,并且与任何引用类型一样,可以为null 。 至关重要的是,开发人员编写返回Optional的方法时, 切勿让该方法返回null [通常应返回Optional.empty()来代替]。 我将用两句话来重申这一点:

  • 第三版 , 有效Java中项目#55中突出显示的句子:“ 切勿从Optional -returning方法返回空值。
  • 斯图尔特·马克(Stuart Marks)使用Optional 的#1规则 ,“永远,永远不要对Optional变量或返回值使用null。”

一个方法中针对多个return语句的参数之一是,它使得识别每种情况下返回的内容变得更加困难(查找所有可能的返回方案)。 使用Optional作为返回类型的一个具体示例说明了这一点。 一个人要确保在某些情况下自己的方法不会返回null ,而在其他情况下则要确保返回Optional实例。 编译器当然不会在每种情况下返回哪个值。

解决此问题的一种方法是只从方法中返回一次,然后开发人员编写代码,而开发人员查看代码则可以轻松地确保不返回null 。 这些开发人员将只需要查找Optional.of(T)调用, Optional.ofNullable(T)调用或Optional.empty()调用。

在方法中使用基础数据类型的局部变量

当在返回点实例化Optional时,这种避免意外返回null而不是空Optional最有效。 换句话说,我发现最好在整个方法中使用Optional包装的类型,然后在最后可能的时候将其放在Optional中。 下一个代码清单提供了这些荒谬的琐碎示例。

声明最终以可选方式返回的局部变量的示例

/*** Provides the middle name if it exists.** @return Middle name if it exists or empty if it doesn't exist.*/
public Optional<String> determineMiddleName1()
{String middleName;// Do whatever logic is necessaryreturn Optional.ofNullable(middleName);
}/*** Provides the middle name if it exists.** @return Middle name if it exists or empty if it doesn't exist.*/
public Optional<String> determineMiddleName2()
{Optional<String> middleName;// Do whatever logic is necessaryreturn middleName;
}

在上面的代码中, determineMiddleName 1 ()方法与基础类型的局部变量一起使用。 通常,这比Optional更容易设置/填充,并且在末尾使用Optional.isNullable()可确保即使是null MiddleName也将作为“空”的Optional而不是null

上面的代码中的defineMiddleName determineMiddleName 2 ()方法声明其局部变量,该局部变量最终将作为Optional<String>返回,然后在该方法末尾返回该引用。

避免局部变量的“默认”初始化

在上面编写方法defineMiddleName determineMiddleName 2 () ,编译器将帮助确保将局部变量“ middleName”设置为某物(即使该“ something”为null ),但开发人员已选择将其“ middleName”变量初始化为null开头,编译器将不会有任何问题。 如果由于某种原因需要初始化局部变量,最好将其初始化为Optional.empty()而不是null 。 如果开发人员选择使用Optional.empty()初始化该变量,那么第二个示例仍然有可能在该方法的后面将本地变量“重置”为null

该讨论使我对Java中将Optional用作方法返回类型有三点看法。

  1. 单个return或多个return s对意外返回null而不是“空”或其他非null的可能性的影响在确定单个返回或多个返回是否最有意义时应考虑Optional引用。
  2. 通过在整个方法中处理基础类型并仅在最新时刻(通常在return )实例化返回的Optional ,通常更容易确保返回Optional引用而不是返回null
  3. 最终将要从方法返回的Optional类型的局部变量,即使“已知”将适当地重新设置,也绝不应最初将其分配为null 。 最好根本不要定义它,以便编译器将确保需要在代码流的每个“分支”中对其进行设置。 最起码,如果是进行初始化,类型的那个局部变量Optional应该被初始化为Optional.empty()而不是向null

这些观察可以合并。 例如,当确定某个方法应具有多个返回(例如实现guard子句 )时,可以在每次返回时返回适当的非null Optional引用,并且直到需要时才初始化局部变量(通过警卫)。 下一个可笑的例子说明了这一点。

避免使用多个返回语句返回空值的示例

public Optional<String> getGuardedData(final String input)
{if (input == null){return Optional.empty();}String data;// Do whatever logic is necessaryreturn Optional.ofNullable(data);
}

我发现Optional类在正确用作方法返回类型时,由于它的流利程度更高,可以使客户端的代码更具可读性。 但是,要获得其最大值,必须遵循纪律应用Optional ,以便代码的客户可以期望返回的Optional永远不会为null 。 这篇文章研究了一些注意事项,可以帮助确保从不会将自已声明为return Optional的方法返回null 。 没有信任,该方法不会返回null ,使用Optional的返回类型只能使事情变得更糟,因为它迫使客户端的非第一次检查null Optional调用上的方法之一,之前Optional 。 这使得调用代码不太流畅

翻译自: https://www.javacodegeeks.com/2018/01/considerations-returning-java-8s-optional-method.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle账户解锁28000,oracle 下载 账号密码ORA-28000账户被锁和解锁

今天测试库有个账户的密码忘了&#xff0c;试了十几次就开始提示&#xff1a;ERROR:ORA-28000: the account is locked意思明显就是账户被锁了&#xff0c;可能是用户的资源设置中对密码重试次数做了限制。验证&#xff1a;SQL> select a.username, b.profile, b.resource_n…

让别人和自己看懂自己的程序代码?一文掌握Java单行多行、文档注释以及注解(Annotation)超详细的理解使用,IDEA注释注解快捷键和模板,提高程序代码更有可读性

文章目录单行和多行注释文档注释&#xff08;Java特有&#xff09;Annotation(注解)的理解常见的Annotation示例IDEA注释注解快捷键及模板自定义 AnnotationJDK 中的元注解单行和多行注释 注释的内容不参与编译&#xff0c;即编译以后的.class的字节码文件中不包含注释的内容。…

Java集合(1)--集合概述

Java 集合可分为 Collection 和 Map 两种体系 Collection接口&#xff1a;单列数据&#xff0c;定义了存取一组对象的方法的集合 ——List&#xff1a;元素有序、可重复的集合 ——Set&#xff1a;元素无序、不可重复的集合 Map接口&#xff1a;双列数据&#xff0c;保存具有…

win7下oracle10g安装,专门针对win7下oracle10g安装的详解

Window 7 下面安装Oracle 10g今在win7下安装oracle 10g client的时候遇到下面问题&#xff1a;在执行先决条件的时候&#xff0c;报目前只支持6.0的版本&#xff0c;修改oraparam.ini文件中的以下内容&#xff1a;[Certified Versions]#You can customise error message shown …

Java集合(2)--Collection接口方法

1、添加 add(Object obj)addAll(Collection coll)2、获取有效元素的个数 int size()在这里插入代码片3、清空集合 void clear()4、是否是空集合 boolean isEmpty()5、是否包含某个元素 boolean contains(Object obj)&#xff1a;是通过元素的equals方法来判断是否是否同一个…

java核心面试_Java核心面试问题

java核心面试问&#xff1a;如果main方法被声明为私有该怎么办&#xff1f; 回答&#xff1a; 该程序可以正确编译&#xff0c;但在运行时会显示“ Main方法不公开”。 信息。 问&#xff1a;在Java中按引用传递和按值传递是什么意思&#xff1f; 回答&#xff1a; 通过引用…

oracle sql条件语句,谁能介绍下Oraclesql之条件语句?

一IF。。THENIFconditionTHENstatements1;statements2;。。。。ENDIF;二IF。。THEN。。。ELSEIFconditionTHENstatements1;statements2;。 。。。ELSEstatements1;statements2;。。。。ENDIF;三IF。。THEN。。ELSIFIFcondition1THENstatement1;ELSIFcondition2THENstatement2;…

Java集合(3)--Iterator迭代器

Iterator对象称为迭代器(设计模式的一种)&#xff0c;主要用于遍历 Collection 集合中的元素。Collection接口继承了java.lang.Iterable接口&#xff0c;该接口有一个iterator()方法&#xff0c;那么所有实现了Collection接口的集合类都有一个iterator()方法&#xff0c;用以返…

oracle 中文脚本,ORACLE常用脚本

--创建表空间Create tablespace BRANCH datafile D:\tablespace\BRANCH.dbf size 500M autoextend on maxsize unlimited;--查询YS所拥有的表空间select distinct(tablespace_name) from dba_segments where ownerYS;--删除用户drop user ys cascade&#xff1b;--删除表空间及…

Java集合(4)--List接口及其实现类ArrayList、LinkedList和Vector

文章目录List接口概述List接口常用方法ArrayList实现类LinkedList实现类Vector实现类List接口概述 List集合类中元素有序、且可重复&#xff0c;集合中的每个元素都有其对应的顺序索引 List容器中的元素都对应一个整数型的序号记载其在容器中的位置&#xff0c;可以根据 序号…

java hadoop_单元测试Java Hadoop作业

java hadoop在我以前的文章中&#xff0c;我展示了如何设置一个完整的基于Maven的项目&#xff0c;以用Java创建Hadoop作业。 当然并没有完成&#xff0c;因为它缺少单元测试部分。 在这篇文章中&#xff0c;我将展示如何将MapReduce单元测试添加到我之前开始的项目中。 对于单…

软件连接oracle失败怎么办,【编程开发工具】navicat连接oracle失败怎么办

Navicat连接oracle数据库时连接失败&#xff0c;出现ORA-28547错误。原因&#xff1a;navicat Primium版本的OCi和本地数据库的OCI版本不一致。解决方法&#xff1a;1、把navicat Primium版本自带oci.dll替换本地Oracle安装路径里的oci.dll。我的本地navicat Primium版本自带oc…

Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet

文章目录Set接口概述HashSet实现类LinkedHashSet实现类TreeSet实现类Set接口概述 1、Set接口是Collection的子接口&#xff0c;set接口没有定义额外的方法&#xff0c;使用的都是Collection接口中的方法。 2、Set 集合不允许包含相同的元素&#xff0c;如果试把两个相同的元素…

php设置超链接,怎么给一个PHP密码访问页面加超链接

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼$password "1234"; // 这里是密码$p "";if(isset($_COOKIE["isview"]) and $_COOKIE["isview"] $password){$isview true;}else{if(isset($_POST["pwd"])){if($_POST["…

Java集合(6)--Map接口

文章目录Map接口概述Map结构的理解Map接口常用方法Map接口概述 Map与Collection并列存在&#xff0c;用于保存具有映射关系的数据:key-value Map中的 key 和 value 都可以是任何引用类型的数据 常用String类作为Map的“键”。key 和 value 之间存在单向一对一关系&#xff0…

php+js表单验证数字,.validate表单验证js

$("#signupForm").validate({rules: {name: {required: true},id:{required:true校验类型:}},messages: {name: {required: "请输入姓名"},id{required: 必填校验类型:}}})name可以填入div里的idrequired 设置必填校验类型取值描述requiredtrue|false必填字…

java低延迟_像Java这样的C ++具有低延迟

java低延迟总览 以前&#xff0c;我写过一篇有关Java之类的C的文章。 这是我以前遇到的术语。 但是&#xff0c;经过思考&#xff0c;我认为像Java这样的C 是一个更好的术语&#xff0c;因为您仍在使用OOP惯例&#xff08;不是C惯例&#xff09;&#xff0c;但是您需要投入更多…

Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties

文章目录HashMap类LinkedHashMap类TreeMap类Hashtable类Properties类HashMap类 1、HashMap类概述 HashMap是 Map 接口使用频率最高的实现类&#xff0c;允许使用null键和null值&#xff0c;与HashSet一样&#xff0c;不保证映射的顺序。 所有的key构成的集合是Set&#xff1a…

为什么SpringBoot如此受欢迎,以及如何有效地学习SpringBoot?

SpringBoot是最流行和使用最广泛的Java框架。 有时这种讨论“为什么SpringBoot如此受欢迎&#xff1f;” 来我和我的朋友/同事之间。 另外&#xff0c;我确实收到了许多人发来的电子邮件&#xff0c;询问“春天很大&#xff0c;如何快速学习&#xff1f;” 。 在这篇文章中&…

支持linux系统摄像头模块,在Linux操作系统上使用摄像头

我的公家笔记本的摄像头一直没啥用&#xff0c;偶尔用 vmware player 2.0模拟个 msn 用(其实到目前一次都没用过)。搞过安全对这东西严重不信任通常都不驱动&#xff0c;忽然想起重案6组那个警察兄弟说搞高科技的最怕高科技产品。linux 下一直没装&#xff0c;晚上闲着没啥事&a…