半路翻译有效吗(译为什么null)
半路翻译有效吗(译为什么null)
2024-09-29 02:49:01  作者:的纪念  网址:https://m.xinb2b.cn/sport/aig299963.html

专注于Java领域优质技术,欢迎关注

原文地址:why null is bad跳转中...原文作者:Yegor Bugayenko译者:高老庄里的猿

先来看个 Java 中使用 null 作为返回值的简单例子:


该方法最大的问题是返回 null 代替了对象。在面向对象规范中使用 null 是个非常糟糕的做法,应该极力避免。有很多论据可以支持这一观点,包括 Tony Hoare 的演讲《Null References, The Billion Dollar Mistake》和 David West 的《Object Thinking》 整本书。接下来我将所有的论据做一些整理并使用合适的面向对象结构代替 null 作为返回值。目前看来,至少有两种方法可以代替使用 null 。

1、使用空对象设计模式(最好定义一个常量)


2、当不能返回一个对象时,可以抛出异常来让调用方 fail-fast(快速失败)


现在来看看反对使用 null 的依据,除了上面提到的 Tony Hoares 的演讲和 David West 的书籍,还有 Robert Martin 的 《Clean Code》、 Steve McConnell 的《Code Complete》、John Sonmez 的 《Say “No” to “Null”》以及 StackOverflow 上的讨论《Is returning null bad design? 》,这些我在写这篇文章之前都看过。

特殊错误处理

每次将对象引用作为输入时都必须检查它是 null 的还是有效的,如果忘了检查,将会导致运行时 NPE(Null Pointer Exception)。因此,你的代码逻辑会被多种检查和 if/then/else 分支所污染。看看下面例子:


这是 c 语言和其他很多面向过程编程语言处理异常所使用的方法,面向对象编程引入异常处理主要就是为了消除这些特殊的错误处理逻辑。在面向对象编程中,我们将异常以冒泡的方式不断的向上抛出直到应用层,这样我们的代码将变得更加小而美。

dept.getByName("Jeffrey").transferTo(dept2);

null 是面向过程编程的"封建余孽",请使用 null 对象或者异常代替之。

语义的二义性

为了显示的将"函数会返回真实的对象或者 null "这层含义表达出来,getByName() 必须命名为getByNameOrNullIfNotFound()。每个类似的函数都应该这样做,否则会给代码阅读者来带来歧义。

为了语义的准确性,你应该为函数定义更长的名称。

为了消除歧义,函数尽量返回一个真实的对象、一个 null 对象或者抛出一个异常。

有些人会争辩说有时为了性能,不得不返回 null。比如 java Map 接口中的 get() 方法,当在 map 中找不到相应的条目时会返回 null,例如:


由于 Map 的 get() 方法返回 null ,上面代码只会在 map 中搜索一次。如果我们想重写 Map 的 get() 方法以让其在查找不到条目时抛出异常,代码应该这样写:


很明显,这个方法比第一个方法慢两倍,怎么办呢? 我觉得 Map 的接口设计存在缺陷(无意冒犯作者),它应该返回一个迭代器 Iterator 以便让我们代码可以像如下这样:


BTW,这正是 C 标准库(STL)中 map::find() 方法的设计思路。

计算机思维 vs 对象思维

假如某人知道 Java 对象是一个指向某个数据结构的指针,并且 知道 null 是一个空指针(在英特尔 x86 处理器中等于 0x00000000),那他应该能接收 if(employee == null) 这个语句。但是,如果以对象思维来进行思考,这个语句就没意义了。 从一个对象的角度来看,我们的代码是这样的:

Hello, 请问是软件部吗?是的。麻烦让我和你们的 employee(员工) Jeffrey 聊聊。请稍等...Hello你是 NULL ?

上面对话的最后一句看起来很奇怪,不是吗? 相反,如果他们在接到我想与 Jeffrey 进行通话的需求后直接挂断电话会快速给我们制造个故障(异常)。这时我们可以尝试着再次拨过去或者直接告诉我们的主管无法联系到 Jeffrey 来完成更大的交易。

或者,他们可以让我们与另一个人交谈,他不是 Jeffrey,但如果我们需要“特定的” Jeffrey(null 对象)的话,他可以帮助我们解决大多数问题,也可以拒绝帮忙。

Slow Failing(慢失败)

与 failing fast(快速失败)相反,上述代码尝试缓慢死亡并杀死其他人。它向调用者隐藏了失败而不是让其知道出了问题需要马上进行异常处理。这个结论与上面"特殊错误处理"章节的讨论很接近。最好让代码尽可能脆弱,必要时让它崩溃。

要确保你的方法对调用方提供的操作数有着极高的要求,如果调用方提供的数据不够或者根本不符合方法主要的使用场景,抛出异常吧。或者返回一个 null 对象,该对象暴露一些常见行为,并对所有其他调用抛出异常,参考如下:


可变的和不完整的对象

一般来说,强烈建议在设计对象时考虑到不变性。这意味着对象在实例化过程中获得所有必要的内容,并且在整个生命周期中永远不会更改其状态。 null 通常被用在延迟加载中以使对象不完整且可变。例如:


这种技术虽然应用广泛,但在面向对象编程中是一种反设计模式的。主要是因为它使一个对象负责计算平台的性能问题,而这对 Employee 对象应该是透明的。

与其管理状态并公开业务相关的行为,不如让对象处理好其自身结果的缓存---这就是延迟加载的目的。缓存不是 employee 该在办公室里做的事,不是吗?

解决办法是不要像上面的例子那样,以这种原始的方式使用延迟加载。相反,将这个缓存问题移到应用程序的另一层。例如在 Java中可以使用面向切面编程技术。 例如,jcabi-aspects 使用 @Cacheable 注解来缓存方法返回的值:


希望通过这篇文章的分析,能让你停止在代码中继续使用 null 作为返回值。

来源:掘金 链接:https://juejin.im/post/5d740e7f5188251325775966

  • 复数乘法法则(复数乘法法则是什么)
  • 2024-09-29复数乘法法则是什么设z1=a+bi,z2=c+di(a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i其实就是把两个复数相乘,类似两个多项式相乘,展开得:ac+a。
  • 圣诞祝福语幽默(幽默的圣诞祝福)
  • 2024-09-29幽默的圣诞祝福圣诞节到雪飘飘,圣诞老人乐淘淘,心情开朗事事好,出门就有财神到,捡到袜子开礼包,大奖对你嘻嘻笑——“祝圣诞开心乐逍遥”!最近电话很拥挤,祝福怕你想不起今天提前送惊喜,免得你把我忘记先祝你棒棒身体,天天。
  • 商南去西安班车(商南往返西安班车班次增加)
  • 2024-09-29商南往返西安班车班次增加商洛新闻网讯:明日起(3月24日),纺织城客运站商南班线增加,途经金丝峡景区,旅客朋友可提前通过“西安公路客票”,“三秦乐行”微信公众号购票车票,进站时请出示西安“一码通”个人识别码,配合工作人员测量。
  • lol沙皇瑞兹改动(LPL四大专属头像火了)
  • 2024-09-29LPL四大专属头像火了前言:S11赛季的比赛正在如火如荼地进行中,相信绝大多数的玩家都关注了最近一段时间的比赛,各大赛区的夏季赛已经结束了,现在进入到了世界赛的最后准备阶段,九月中下旬的时候,各大战队都会启程前往冰岛就在最。
  • 琉璃美人煞什么时候播出(琉璃美人煞剧情简介)
  • 2024-09-29琉璃美人煞剧情简介琉璃美人煞播出时间已经定在2020年的10月1日剧情简介:簪花比武大会即将在少阳派举行,掌门褚磊的大女儿玲珑机灵能干,被委以接待各派参赛弟子的重任二女儿璇玑懵懂懒散、荒废武艺,被褚磊罚去明霞洞思过离泽。
  • 南怀瑾谈一生做好了三件事(一个人立身成才)
  • 2024-09-29一个人立身成才现在很多家长拼命赚钱,只是为了送孩子进最好的学校,接受最好的教育,但孩子一进学校家长就不管不问了,把一切都交给老师管而老师则极力倡导家校合作,希望可以和家长一起管理一旦孩子成绩下滑,家长便责怪老师不负。
  • 从监狱出来的人真的会改变吗(当一个人进过监狱)
  • 2024-09-29当一个人进过监狱创作声明:内容包含虚构创作创作声明:内容包含虚构创作能定义你的,只有你自己所以种下一棵大树最好的时机,永远是现在我上小学的时候,学思想品德,书上说监狱都是关押坏人的地方我上初中的时候,思想品德改名叫政。
  • 猫的一般寿命是多少年(猫的寿命是多少年)
  • 2024-09-29猫的寿命是多少年猫咪的健康和寿命显然是被排在首位的,那猫咪的寿命是多少?一、普通猫咪的寿命为多少介绍这个之前,应该要说说猫咪的种类种类不同的猫咪自然寿命也有差别,比如狸花猫的寿命在15年左右,狮子猫的寿命为16~2。
  • 吴佩慈封肚43岁宣告豪门梦碎(吴佩慈35岁未婚先孕)
  • 2024-09-29吴佩慈35岁未婚先孕“我怀孕了,孩子是男友纪晓波的,我们很快就会结婚!”2013年,35岁的吴佩慈,不仅高调地晒出了男友纪晓波送给她的那颗价值2500万的10克拉钻戒,还和大家官宣了她未婚先孕的喜讯她满心欣喜地以为自己怀。
  • 新安江旅游详细攻略(广州出发-河源2天游)
  • 2024-09-29广州出发-河源2天游今天给大家介绍一条河源2天行程,畅游河源巴伐利亚庄园,欧式风情小镇,体验他国风景,巴伐利亚游玩项目众多,有富源寺,水上高尔夫,黑森林,儿童乐园,溜冰场,温泉等;畅游万绿湖镜花缘,风景美如画;南越王山不。
  • 暖心情话(最感动的暖心情话)
  • 2024-09-29最感动的暖心情话你的过去我来不及参与,你的未来我奉陪到底未来依然是个变数,但在未来的路上,我还是很想牵着你的手,一同小心经营,努力期待幸福到来的一天很喜欢你的眼睛,像是窗口打开我的心扉,很喜欢你温柔,像是春风吹进我的。