使用可选是可选的

在上周的“收藏中的可选内容”一文发表之后,我不禁要多讲一些关于同一只野兽的事情。 更多细节。

最初由Google Guava引入并后来包含在Java 8软件包中的Optionial类只是包装可选对象的包装器。 从包装对象存在或包装中没有对象的意义上讲,包装对象是可选的,在这种情况下,包装对象为空。 那里没有太多魔法。 包装代码( 可选类)坚持包装的对象不是null 。 毕竟nullnull ,不是对象。 对象永远不会为null 。 只有对对象的引用可以为null

这些都是细微差别,细节; 但重要的细节。 毕竟,这些精细的细节是那些需要引入Optional的细节。 一般的Java程序员看不到如此细微细节的重要性。 他们认为Optional与包装对象本身的变量一样好,并假设变量也可以为null 。 在某种程度上,它们是正确的。 在自己的水平上。

这个级别表示好的代码是可以理解的,就是这样。 运行银行,保险公司,起搏器和武器的大多数企业遗留代码都是在此级别上制定的。 您无法做到这一点,只是希望自己有运气,而软件错误不会在“炸弹”中爆炸时选择您的房屋,银行账户或遗体(如果使用医疗设备)。 您可以做的是理解问题并尽自己的一份力量来慢慢改善情况。 除非我们所有人在那之前被消灭,否则这将需要几代人的时间。

“代码工作”和“可能理解”是软件的最基本要求。 过去我们曾说过,如果软件能够运行,那么就可以了,对于维护而言,只要有两个能理解代码的“人”就够了:创建软件的编码者和创建编码的上帝。 幸运的是,还有更高的水平。 (我的意思是高于编码者。而不是高于上帝。)

下一个级别是“代码工作”和“易于理解(不是那么难)”。 如果您必须调试代码并需要确定某些故障的根本原因,这一点很重要。 “代码工作”和“易于修改”再次成为新的阶梯。 我看过容易理解的代码。 代码正在运行。 但是不同模块之间的依赖性是如此复杂,就像花边或传统的意大利面条一样。 无论我想在此处更改某些内容以修复错误,还是在其他一些地方该程序开始失败。 易于修改:该代码不是。

下一个级别是“代码工作”,“易于修改” “很难创建错误的修改”。 这意味着该代码提供了样式和内部数据结构以及API,维护人员将在一定程度上遵循它们,并将创建一个仍可正常工作,易于理解和修改的可修改工作代码。 这是我们到达Optional的要点。

当方法返回Optional时 ,它表示它可能返回某些内容或什么都不返回。 Optional <Integer>可能返回一个Integer,但可能只返回一个空的Optional ,这意味着:没有我可以返回的Integer 。 为什么比返回可能为nullInteger更好呢?

可选方法返回值

答案是,在返回Optional <Integer>的情况下,您不能:

integer = methodReturningIntegerOrNull();
otherInteger = integer +1;

导致NPE。 你为什么这么做? 因为您忘记检查了,JavaDoc在描述的末尾某处提到了这种可能性,当您进行编码时,该可能性在鼠标悬停在窗口上方不可见。 如果是Optional <Integer> ,则必须执行以下操作:

optionalInteger = methodReturningOptionalInteger();
if( optionalInteger.isPresent() ){otherInteger = optionalInteger.get() +1;}

仍然有机会写:

optionalInteger = methodReturningOptionalInteger();
otherInteger = optionalInteger.get() +1;

但是在那种情况下,你应该得到你所得到的。

可选帮助您创建更多代码和更少文档。 它提供了一种语义,以便以比可为空的值更难忽略的方式传递一些可选值。 它说:我不信任您正确处理null ,因此给您一个包装的对象,因此您必须显式处理可选性。

如果您认为您可以轻松回答问题

  • 需要Optional <Something>作为方法参数
  • 具有一个私有字段可选。

是个好主意。

可选方法参数

有优点也有缺点。 当论据说:

countFrom(Optional<Date> from, Date to);

显然,当缺少一个值时,可能会缺少from值,并且应该有一些特殊的默认语义。 另一方面,调用方可以传递null以获得特殊行为。 忽略错误的可选性,调用者传递null的可能性较小。 即使参数是Optional ,实际传递的参数仍可以为null ,我希望在这种情况下该方法将抛出NPE。 最后但并非最不重要的一点是,引入了Optional的另一个危险:调用者可以传递Optional,它包含一个非Date的对象。 泛型可以在Java中轻松绕开,草率的编码器可能会传递错误的Optional 。 这意味着您必须在方法中实现断言:

  • 参数不为空,
  • 参数是正确的类型。

还要记住,在方法返回值的情况下, Optional是说: 我不信任您正确处理null ,因此我给了您一个包装好的对象,因此您必须显式地处理可选性 。 当您创建需要Optional作为参数的API时,此消息将是什么? 请不要相信我! 只给我可选的,因为即使我也不相信自己能够正确处理null值。 很奇怪… 另一方面,我相信您不会传递null或错误的类型。

我认为:在这种情况下,使用Optional不会比为API提供适当的文档提供更多的价值,并且不会强迫调用者表现得比它更好。 另一方面,您将额外的代码放在自己的肩膀上。

Optional提供您信任的代码,从不信任您的代码但不要求它的代码中接受它! 相信自己!

私人可选字段

当您将本地私有字段声明为Optional时,您将迫使该类的开发人员更加注意该字段的可选功能。 这样做的代价是额外的包装程序,可选的代码处理中的额外混乱情况。 另一方面,没有太大的收获,因为您可以在检查所有要考虑字段值的情况下获得扩展单元测试的相同质量级别。 由于所有代码都由当前开发人员负责整个代码,因此Optional没有任何好处。 就像您不信任自己一样。 这是一个严重的问题,需要比Optional Java类提供的更多和不同的对待。

功能编程中的可选

如果需要,可以使用Optional以功能性编程风格对Java进行编程,但是Java不是一种功能语言,而Optional和lambda以及功能性风格方法本身并不能实现。 但这是以后要讨论的话题。

翻译自: https://www.javacodegeeks.com/2015/09/use-of-optional-is-optional.html

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

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

相关文章

kali 清理系统垃圾文件

网上常用的shell命令 #!/bin/bash echo "clear temp file..." sudo apt-get autoclean # 清理旧版本的软件缓存 sudo apt-get clean # 清理所有软件缓存 sudo apt-get autoremove # 删除系统不再使用的孤立软件 echo "clear disk temp..." sync  #…

PDF如何XSS

简介 在上传点时&#xff0c;如果上传不了图片格式的文件&#xff0c;可以尝试上传html或者pdf文件来达到xss的效果。上传html就不多说了&#xff0c;下面来说说怎么让pdf弹窗。 操作步骤&#xff1a; 环境准备&#xff1a;python3 需要准备poc.py和poc.js poc.py内容 # FRO…

NOI 练手题 图像旋转翻转变换

题目&#xff1a;来源http://noi.openjudge.cn/ch0112/09/ 总时间限制: 1000ms内存限制: 65536kB描述给定m行n列的图像各像素点灰度值&#xff0c;对其依次进行一系列操作后&#xff0c;求最终图像。 其中&#xff0c;可能的操作及对应字符有如下四种&#xff1a; A&#xff1a…

CSDN Chrome插件来啦,听说可以提升开发者效率,我们先来研究一波

孙叫兽,安徽宿州人,北漂前端全栈程序员(朝着这个目标努力),如果你觉得这篇文章帮助了你,记得三连👉(转发+点赞+评论),技术交流请联系个人主页左侧导航栏。 这个插件的定位是提升程序员的开发效率的,至于哪方面?自己慢慢体会,我大致的感觉就是搜索引擎的导航网站的…

C盘全面清理教程!彻底清理所有垃圾!

预计阅读时间 10分钟 资源在文末获取哦 老懒粉应该知道&#xff0c;我们写过“宇宙最细”的系统安装/重装教程 但我们除了新机&#xff0c;通常情况下重装系统的目的是什么&#xff1f; 虽然不管电脑出现了什么样的软件方面问题&#xff0c;我们都可以通过重装系统来一劳永…

python常用类型的内置函数列表

1、list.append(obj) 向列表中加入一个对象obj fruits [apple, pear, orange] >>> fruits.append(apple) >>> fruits [apple, pear, orange, apple]2、list.count(obj) 返回一个对象obj在列表中出现的次数 >>> fruits.count(a…

java虚拟内存扩展_Java 8虚拟扩展方法

java虚拟内存扩展我一直关注Java 8 Lambda表达式项目的发展已经有一段时间了&#xff0c;我对其当前的进展状态感到非常兴奋。 我发现的最新“易于理解”的演示文稿是这样的&#xff1a; http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf 现在&…

url重定向绕过方式

url重定向绕过方式 俗话说的好&#xff0c;上有政策&#xff0c;下有对策&#xff0c;url重定向的绕过姿势也越来越多样化。普通url重定向方法测试不成功&#xff0c;换个姿势&#xff0c;说不定可以再次绕过。 这里总结下成功的绕过方式。 &#xff08;1&#xff09; 使用…

【转】android:DDMS查看Threads--不错

原文网址&#xff1a;http://www.cnblogs.com/mybkn/archive/2012/05/27/2520335.html 有时候程序运行出现死锁或者信号量卡死是很纠结的问题&#xff0c;单看代码很难分析定位问题&#xff0c;这时候可以借助DDMS来查看threads的运行情况&#xff0c;一目了然。 手机连接上USB…

史上最全的技术手册整理总结,编程小白都从这篇文章迅速成为大牛

孙叫兽,前端全栈攻城狮,更多资源请关注微信公众号:电商程序员 整理云端的开发,助你开发效率与认知起码提升十倍。 技术手册 Python初级手册Python进阶手册Python2手册Python3手册HTML手册CSS手册CSS3手册HTML5手册Boostrap4手册Boostrap3手册Boostrap手册

并发最佳实践

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的过程&#xff01; 在这里查看 &#xff01; 目录 1.简…

Fastjson反序列化漏洞复现(实战案例)

漏洞介绍 FastJson在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。通过查找代码中相关的方法&#xff0c;即可构造出一些恶意利用链。 通俗理解就是&#xff1a;漏洞利用fastjson autotype在处理json对…

SVN Error: Can‘t connect to host xxxxx‘: 由于目标计算机积极拒绝,无法连接,的最快解决办法

孙叫兽&#xff0c;前端全栈&#xff0c;微信公众号&#xff1a;电商程序员。如果本文对你有帮助&#xff0c;记得点赞关注&#xff0c;谢谢&#xff01; 每次换个新电脑&#xff0c;新项目&#xff0c;新场地&#xff0c;新公司都有可能使用SVN下载老项目,有的是用内网&#x…

夺命雷公狗---无限级分类NO3

<?phpheader("Content-Type:text/html;charsetutf-8");/*无限级分类。牵扯2个应用0是-找指定栏目的子栏目1是-找指定栏目的子孙栏目&#xff0c;即子孙树2是-找指定栏目的父栏目/父父栏目....顶级栏目&#xff0c;即家谱树*/$aarr array(array(id>1,name>…

百度地图接口调用

当我们网站需要调用百度地图接口的时候&#xff0c;可以使用如下方法&#xff1a; 1.如何获取经纬度坐标 1.打开百度地图&#xff0c;在百度地图最底部找到“地图开放平台”链接。 2.进入“百度地图开放平台”网站中&#xff0c;在导航中选择“”开发文档>坐标拾取器“”…

java后端工程师平时开发或多或少会用到eclipse,那么它有哪些快捷键呢

孙叫兽&#xff0c;前端全栈工程师&#xff0c;微信公众号&#xff1a;电商程序员&#xff0c;主页QQ群有eclipse安装包。 下载地址&#xff1a;https://www.eclipse.org/downloads/ Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言&#xff0c;它只是一个…

信息安全系统设计基础第六周学习总结

第六章 存储器层次结构 存储器系统 是一个具有不同容量、成本和访问时间的存储设备的层次结构。 1.CPU寄存器&#xff1a;容量小&#xff0c;成本高&#xff0c;访问快 2.高速缓存存储器&#xff1a;CPU和主存之间的缓存区域 3.主存&#xff1a;磁盘上大容量&#xff0c;成本低…

phpStudy + PhpStorm + XDebug调试【绝对能用】

具体参照的是这篇文章&#xff1a;https://blog.csdn.net/weixin_40418199/article/details/79088365 文章有些地方说的不是很详细想重写整理下。 【PHPStudy演示的版本为&#xff1a;PHP5.4.45-Apache】 1.PHPStudy配置 PHPStudy自带了XDebug的扩展&#xff0c;不需要下载 php…

亚马逊标题自动抓取_15分钟内开始使用Amazon Web Services和全自动资源调配

亚马逊标题自动抓取在等待一个新项目时&#xff0c;我想学习一些有用的东西。 而且由于在许多项目中我们需要评估和测试正在开发的应用程序的性能&#xff0c;而很少有足够的硬件来生成实际负载&#xff0c;因此我决定学习更多有关按需在云中按需配置虚拟机的知识&#xff0c;即…

java后端工程师平时开发或多或少会用到Intellij idea,那么它有哪些快捷键呢

孙叫兽,前端全栈工程师,微信公众号:电商程序员,主页QQ群有Intellij idea安装包及注册码。 下载地址:https://www.jetbrains.com/idea/download/ IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、…