请使用复选框选择_使用可选是可选的

请使用复选框选择

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

最初由Google Guava引入并后来包含在Java 8软件包中的Optionial类只是包装可选对象的包装器。 从包装对象存在或包装中没有对象的意义上讲,包装对象是可选的,在这种情况下,包装对象为空。 那里没有太多魔法。 包装代码Optional类坚持认为,包装的对象不是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 。 这意味着您必须在方法中实现断言:

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

还要记住,在方法返回值的情况下, 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/337398.shtml

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

相关文章

python爬去百度图片_python实现爬取百度图片的方法示例

本文实例讲述了python实现爬取百度图片的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; import json import itertools import urllib import requests import os import re import sys wordinput("请输入关键字&#xff1a;") path"./ok" …

C++程序的内存分区模型-栈区堆区

点击蓝字关注我们1、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量等&#xff08;由编译器管理其“生死”&#xff09;注意事项&#xff1a;不要返回局部变量的地址&#xff0c;栈区开辟的数据由编译器自动释放栈区代码演示&#xff…

CocosStudio的节点如何使用自定义shader

CocosStudio的节点如何使用自定义shader问题&#xff1a;我想对CocosStudio 的 某个UI 里的 某个图片&#xff08;如下图所示的Image类型&#xff09;使用自定义shader。但是&#xff0c;我把 对传统的cc.Sprite应用自定义shader的方式 应用于它时&#xff0c;并不生效&#xf…

concurrency_Java Concurrency Essentials教程

concurrency课程大纲 并发一直是开发人员面临的挑战&#xff0c;编写并发程序可能非常困难。 引入并发性时&#xff0c;可能会发生很多事情&#xff0c;并且系统的复杂性会大大增加。 但是&#xff0c;编写健壮的并发程序的能力是开发人员的必备工具&#xff0c;并且可以帮助构…

excel随机抽取_简单随机抽样及其进阶分层随机抽样方法展示

一、分享简单随机抽样的几种方法1、抽样分析工具抽样2、INDIRECTRANDBETWEEN函数抽样3、RAND排序抽样4、SAS抽样二、分层抽样方法1、Python分层抽样2、SAS分层抽样3、EXCEL函数及功能分层抽样简单随机抽样的几种方法方法一抽样分析工具抽样如果你的EXCEL尚未安装数据分析&#…

为什么存在动态内存分配,动态内存函数(malloc函数,free函数,calloc函数,realloc函数)...

点击蓝字关注我们1.当前我们知道的内存的使用方法2.为什么存在动态内存分配如上我们已学的开辟空间的方式有两个特点&#xff1a;空间开辟的大小是固定的必须指定数组的长度所以就产生了空间开大了浪费开小了不够用的问题&#xff0c;所以使用动态内存分配3.动态内存函数&#…

论游戏项目中的左与右

标题《论游戏项目中的左与右》 何为左与右&#xff1f;左&#xff0c;左倾&#xff0c;即 激进主义&#xff0c;冒险主义&#xff0c;盲动主义。右&#xff0c;右倾&#xff0c;即 消极主义&#xff0c;保守主义&#xff0c;投降主义。 &#xff08;一&#xff09;先说说关于…

java处理注释_Java注释处理器

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

C++ vector类的模拟实现

点击蓝字关注我们1.前言vector和string虽然底层都是通过顺序表来实现的&#xff0c;但是他们利用顺序表的方式不同&#xff0c;string是指定好了类型&#xff0c;通过使用顺序表来存储并对数据进行操作&#xff0c;而vector是利用了C中的泛型模板&#xff0c;可以存储任何类型的…

visual studio源文件的编译顺序是依据什么?

问题&#xff1a;visual studio源文件的编译顺序是依据什么&#xff1f; 结论&#xff1a;依据 .vcxproj 文件里 指定了ClCompile的ItemGroup &#xff0c;如下图所示&#xff0c;就是这么简单粗暴。

并发运行的最佳实践_并发最佳实践

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

功能齐全的屏幕截图C++实现详解

点击蓝字关注我们1、概述要使用屏幕截图&#xff0c;其实很容易&#xff0c;装一款聊天软件或者办公软件就可以了&#xff0c;比如QQ、企业微信、钉钉、飞书等。但要开发出类似这些软件的屏幕截图模块&#xff0c;则没那么容易。其实实现屏幕截图的技术并不复杂&#xff0c;主要…

如何判断exe文件是debug还是release编译生成的

如何判断exe文件是debug还是release编译生成的结论&#xff1a; 用IDA工具打开exe&#xff0c;然后看Imports里面的依赖库是否有带d或D结尾的&#xff0c;如果有就说明是Debug的 实验&#xff1a;&#xff08;实验环境 vs2017&#xff0c; IDA工具&#xff09; &#xff08;0&…

大屏可视化分配率是什么意思_什么是分配率?

大屏可视化分配率是什么意思诸如“不可持续的分配率”和“您需要保持较低的分配率”之类的短语似乎仅属于Java Champions的词汇表。 复杂&#xff0c;恐怖并被魔术光环包围。 经常发生的情况是&#xff0c;当您更仔细地查看概念时&#xff0c;魔术会随着抽烟消失。 这篇文章试…

C/C++语言动态开辟的杨辉三角

点击蓝字关注我们问题引入杨辉三角相必大家并不陌生&#xff0c;第1行有1列、第二行有2列…第n行有n列&#xff0c;且每行行首和行尾的值都为1&#xff0c;其余的值为上一行两数相加我们在C语言阶段&#xff0c;第一次碰到的杨辉三角应该都是用常规的二维数组存储&#xff0c;可…

git gui 历史版本_这些Git命令都不会,还是不要去面试了

前言以下&#xff0c;项目中经常使用的Git命令&#xff0c;汇总到这里以便与你能快速的学习和掌握Git命令&#xff0c;在文章最后有惊喜哟&#xff0c;一定要看到最后啊&#xff01;使用的 Git版本&#xff1a;git version 2.24.0命令git log# 输出概要日志,这条命令等同于# gi…

java restful_Java EE中的RESTful计时器

java restful在这篇文章中...。 EJB计时器旋风之旅 通过带有示例实现的简单REST接口即时使用EJB计时器 更新&#xff08;2015年7月14日&#xff09; 该应用程序的前端现在可以在OpenShift上使用 。 由于我是前端新手&#xff0c;因此我在其他来源的帮助下组装了此HTML5 Ang…

【lua学习】1.源码组织

虚拟机核心相关文件列表内嵌库相关文件解释器&#xff0c;字节码编译器相关的文件做cocos2d-x lua已经有一段时间了&#xff0c;想更深入了解lua。我会出一系列地 自身学习过程中地解读。我会带大家沿着源码来逐步解读lua&#xff0c;我喜欢按照 深度优先遍历的顺序来解读源码&…

c# 联合halcon 基于相关性 模板匹配_机器视觉之halcon入门(5)-字符识别exe生成...

2.3.2 第二个halcon程序转EXE程序&#xff1a;字符识别老规矩&#xff0c;每一段halcon代码得用C#二次开发下。根据上一节所教的&#xff0c;我们配置下C#的环境&#xff0c;顺便添加好控件&#xff0c;如下图(2-3-2-1)。图 2-3-2-1控件基本跟上一节一样&#xff0c;只是少了一…

C语言数据的存储和取出(超详细讲解)

点击蓝字关注我们整形的储存我们知道一个整形的存储是以补码的形式储存取出是原码的形式。比如&#xff1a;int a 5;的二进制是101那它的原码应该是&#xff1a;00000000 00000000 00000000 00000101正数的原反补相同那它存进去和取出来都是&#xff1a;00000000 00000000 000…