写java代码时的注意事项_从方法返回Java 8的可选项时的注意事项

写java代码时的注意事项

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

单一收益与多重收益

在一般的软件开发社区和Java开发社区中,有一段时间一直在争论(“ 宗教战争 ”)有关是否应该编写只return一次的方法(在此讨论中不算抛出异常 )。 一方面, Yegor Bugayenko认为“ 许多返回语句在OOP中不是一个好主意 ”, Tom Dalling认为“ 从函数中获得一个退出点(返回)是一件好事 ”,而且许多人认为经常有多个return语句表明需要重构该方法 。 在另一边, 布鲁斯·埃克尔认为多个return语句可以使代码“更清晰”, 泰勒·戈蒂埃认为,“ 格言 ”,“一种方法,应该有一个且只有一个出口点”,“可能是十分错误的”, 彼得· 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中间名也将作为“空”的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对意外返回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

写java代码时的注意事项

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

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

相关文章

Linux 命令之 iconv -- 转换文件的字符编码

文章目录一、命令介绍二、命令语法三、常用选项四、命令示例&#xff08;一&#xff09;对指定文件进行转码&#xff0c;且输出到指定的文件中一、命令介绍 iconv 命令是 Linux 系统自带的用于转换文件编码的命令行工具&#xff0c;iconv 命令用来转换文件的编码方式&#xff…

python asyncio future_Python asyncio.isfuture方法代码示例

本文整理汇总了Python中asyncio.isfuture方法的典型用法代码示例。如果您正苦于以下问题&#xff1a;Python asyncio.isfuture方法的具体用法&#xff1f;Python asyncio.isfuture怎么用&#xff1f;Python asyncio.isfuture使用的例子&#xff1f;那么恭喜您, 这里精选的方法代…

python爬取网站的图片

python爬取网站的图片 本次爬取图片所需要用到的库&#xff1a;Requests库&#xff0c;BeautifulSoup库&#xff0c;正则表达式&#xff0c;os库。 思路&#xff1a;先爬一张图片&#xff0c;再爬一个网站的图片 先爬一张图片&#xff1a; 首先要得到这张图片的地址&#x…

spring 定时器注释_带注释的控制器– Spring Web / Webflux和测试

spring 定时器注释Spring Webflux和Spring Web是两个完全不同的Web堆栈。 但是&#xff0c; Spring Webflux继续支持基于注释的编程模型 使用这两个堆栈定义的端点可能看起来很相似&#xff0c;但是测试这种端点的方式却完全不同&#xff0c;并且编写这种端点的用户必须知道哪…

python计算方位角_实例讲解:用python 计算方位角(根据两点的坐标计算)记得收藏哦...

今天为大家分享一篇python 计算方位角实例(根据两点的坐标计算)&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起来看看吧&#xff01;知道两点坐标&#xff0c;怎么计算两点方向的方位角&#xff1f;答&#xff1a;首先计算坐标增量dx&#xff0c;dy(两个…

Java 中的自举类,到底是什么?

欲知详情&#xff0c;猛戳&#xff1a;https://www.zhihu.com/question/447748200

数据库考研SQL操作

SQL的动词 SQL功能动词数据查询SELECT数据定义CREATE, DROP, ALTER数据操纵INSERT, UPDATE, DELETE数据控制GRANT, REVOKE 注&#xff1a;以下[ ]表示方括号的内容可要可不要&#xff0c;|表示或&#xff0c;//表示注释。 一、数据定义 1.CREATE 定义模式 CREATE SCHEMA &…

objects jdk8_JDK 9:NotNullOrElse方法已添加到Objects类

objects jdk8JDK 9向Objects类添加了一些新方法&#xff0c;包括本文中突出显示的两个static方法&#xff1a; requireNonNullElse&#xff08;T&#xff0c;T&#xff09;和requireNonNullElseGet&#xff08;T obj&#xff0c;Supplier <&#xff1f;extended T>供应商…

用户登陆_华为路由器AAA用户密码登陆你了解吗?

AAA Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;、Accounting&#xff08;&#xff09;它提供了认证、授权、计费三种安全功能,可以验证用户帐户是否合法&#xff0c;授权用户可以访问的服务&#xff0c;并记录用户使用网络资源的…

Java API 文档中的接口方法和抽象方法,有什么区别?

欲知详情&#xff0c;猛戳&#xff1a;https://www.zhihu.com/question/445956288

java程序设置jvm_Java程序员应在2018年学习的3种JVM语言

java程序设置jvm如果您是Java程序员&#xff0c;并且想学习更多的编程语言以扩展您的知识和技能&#xff0c;但是不确定选择哪种编程语言&#xff0c;那么您来对地方了。 在本文中&#xff0c;我将分享Java程序员可以在2018年学习的3种JVM语言以及为什么要学习它们。 成为多语种…

word域变成正常文本_【Word小技巧】不学会后悔哦~

工作中使用Word早已成了习惯&#xff0c;因此&#xff0c;今天小编将为大家分享几个实用的的Word小技巧。重叠字快速录入文字录入是word最基本操作&#xff0c;过程中我们难免要输入重叠字&#xff0c;例如&#xff1a;热热闹闹&#xff0c;卿卿我我等……你知道如何快速录入吗…

Java 中把声明变量的语句如果写在循环体内,每次执行时栈内存中的变量和数据是如何变化的?

问题一&#xff1a;如下面的代码示例 1&#xff0c;JVM 是不是会反复回收旧的变量 a 再重新创建新的变量 a 呢&#xff1f;还是旧的变量 a 一直保留在栈内&#xff0c;只是反复赋值 0 而已呢&#xff1f; 代码示例 1&#xff1a; while (true) { int a 0; a 5; }问题二&…

使用Speedment 3.0.17及更高版本简化了事务

交易次数 有时我们想确保我们的数据库操作是原子执行的&#xff0c;并且与其他操作分开。 这是交易起作用的地方。 交易是一组操作 数据库可能接受或不接受作为原子操作的建议。 因此&#xff0c;要么接受交易中的所有操作&#xff0c;要么不接受交易中的所有操作。 事务的另一…

python中常用的方法

python常用方法 字符串&#xff1a; name.title() #字符串的每个单词首字母大写 name.upper() #字符串的字母全部大写 name.lower() #字符串的字母全部小写 name.rstrip() #删除字符串结尾的空白 name.lstrip() #删除字符串开头的空白 name.strip() #删除…

sql server 2008 年累计数_Windows Server 2008 和 SQL Server 2008将终止支持 迁移至Azure 微软提供3年免费技术支持...

点击上方蓝色字关注我们~迁移至 Azure 并利用免费扩展安全更新。了解有关支持终止建议的更多信息&#xff0c;请使用浏览器访问&#xff1a;https://www.microsoft.com/zh-cn/sql-server/sql-server-2008.对您意味着什么1 2017年基于风险的安全报告; 思科 2017 年度网络安全报告…

递归调用方法时栈内存是如何变化的?(使用内存图演示递归调用过程)

文章目录 什么是栈内存演示方法递归调用过程什么是栈内存 在学习递归实现原理之前,我们先了解一下栈内存。 栈内存是计算机中的一种数据存储方式,是 Java 进程启动时候在内存中开辟的存储空间。 栈内存的利用方式遵循 LIFO(后迚先出)原则Java 所有局部变量都在栈中分配(压入…

旧版Requests库

requests库基本使用Requests解析库方法response对象response对象的属性**r.encoding**属性与**r.apparent_encoding**属性的区别requests库的异常举例Requests解析库 方法 最常用的两个方法: request.get() request.post() 作用&#xff1a;都是从服务器获取网页信息 区别&…

运行单个源文件_使用一个命令执行单个Java源文件

运行单个源文件JDK增强提案 &#xff08; JEP &#xff09; 草案于2017年末创建&#xff0c;名为“ 启动单文件源代码程序 ”&#xff08;其相关的JDK问题为JDK-8192920 &#xff09;。 顾名思义&#xff0c;该JEP草案旨在“增强Java启动器以支持运行作为Java源代码的单个文件提…

夸克浏览器怎么安装脚本_iOS 第一浏览器发布安卓版,除了真香我还能说什么...

如果不算 Safari 的话&#xff0c;iOS 平台公认最好的浏览器是 Alook。无推送无新闻无广告、日常售价 12 元、工具类排行第三、7.8 万个评分足以证明其优秀。以至于很多双持或对 Alook 有所了解的用户都希望 Alook 能推出安卓端。现在安卓端真的来了。(安卓端免费)假如这个时候…