当前位置:首页 > 科技  > 软件

别再用 “! = null” 做判空了!

来源: 责编: 时间:2023-09-18 21:41:59 189观看
导读问题为了避免空指针调用,我们经常会看到这样的语句:...if (someobject != null) { someobject.doCalc();}...最终,项目中会存在大量判空代码,丑陋繁杂。。。如何避免这种情况?是否滥用了判空?精华回答这是初、中级程序猿

问题

为了避免空指针调用,我们经常会看到这样的语句:RXP28资讯网——每日最新资讯28at.com

...if (someobject != null) {    someobject.doCalc();}...

RXP28资讯网——每日最新资讯28at.com

最终,项目中会存在大量判空代码,丑陋繁杂。。。如何避免这种情况?是否滥用了判空?RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

精华回答

RXP28资讯网——每日最新资讯28at.com

这是初、中级程序猿经常会遇到的问题。他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空。另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空。RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

吐槽完毕,回到这个题目本身:RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

进行判空前,请区分以下两种情况:RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

  1. null 是一个有效有意义的返回值(Where null is a valid response in terms of the contract; and)
  2. null是无效有误的(Where it isn't a valid response.)

RXP28资讯网——每日最新资讯28at.com

你可能还不明白这两句话的意思,不急,继续往下看,接下来将详细讨论这两种情况RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

先说第2种情况

RXP28资讯网——每日最新资讯28at.com

null就是一个不合理的参数,就应该明确地中断程序,往外抛错误。这种情况常见于api方法。例如你开发了一个接口,id是一个必选的参数,如果调用方没传这个参数给你,当然不行。你要感知到这个情况,告诉调用方“嘿,哥们,你传个null给我做甚"。RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

相对于判空语句,更好的检查方式有两个:RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

  • assert语句,你可以把错误原因放到assert的参数中,这样不仅能保护你的程序不往下走,而且还能把错误原因返回给调用方,岂不是一举两得。(原文介绍了assert的使用,这里省略)
  • 也可以直接抛出空指针异常。上面说了,此时null是个不合理的参数,有问题就是有问题,就应该大大方方往外抛。

RXP28资讯网——每日最新资讯28at.com

第1种情况会更复杂一些。RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

这种情况下,null是个”看上去“合理的值,例如,我查询数据库,某个查询条件下,就是没有对应值,此时null算是表达了“空”的概念。RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

这里给一些实践建议:

RXP28资讯网——每日最新资讯28at.com

假如方法的返回类型是collections,当返回结果是空时,你可以返回一个空的collections(empty list),而不要返回null,这样调用侧就能大胆地处理这个返回,例如调用侧拿到返回后,可以直接print list.size(),又无需担心空指针问题。(什么?想调用这个方法时,不记得之前实现该方法有没按照这个原则?所以说,代码习惯很重要!如果你养成习惯,都是这样写代码(返回空collections而不返回null),你调用自己写的方法时,就能大胆地忽略判空)RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

返回类型不是collections,又怎么办呢?RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

那就返回一个空对象(而非null对象),下面举个“栗子”,假设有如下代码:RXP28资讯网——每日最新资讯28at.com

public interface Action {  void doSomething();} public interface Parser {  Action findAction(String userInput);}

RXP28资讯网——每日最新资讯28at.com

其中,Parse有一个接口FindAction,这个接口会依据用户的输入,找到并执行对应的动作。假如用户输入不对,可能就找不到对应的动作(Action),因此findAction就会返回null,接下来action调用doSomething方法时,就会出现空指针。RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

解决这个问题的一个方式,就是使用Null Object pattern(空对象模式)。RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

改造后

RXP28资讯网——每日最新资讯28at.com

类定义如下,这样定义findAction方法后,确保无论用户输入什么,都不会返回null对象:RXP28资讯网——每日最新资讯28at.com

public class MyParser implements Parser {  private static Action DO_NOTHING = new Action() {    public void doSomething() { /* do nothing */ }  };   public Action findAction(String userInput) {    // ...    if ( /* we can't find any actions */ ) {      return DO_NOTHING;    }  }}

RXP28资讯网——每日最新资讯28at.com

对比下面两份调用实例:RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

  • 冗余:每获取一个对象,就判一次空
Parser parser = ParserFactory.getParser();if (parser == null) {  // now what?  // this would be an example of where null isn't (or shouldn't be) a valid response}Action action = parser.findAction(someInput);if (action == null) {  // do nothing} else {
  • 精简
ParserFactory.getParser().findAction(someInput).doSomething();

无论什么情况,都不会返回空对象,因此通过findAction拿到action后,可以放心地调用action的方法。RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

其他回答精选:

RXP28资讯网——每日最新资讯28at.com

(1) 如果要用equal方法,请用object<不可能为空>.equal(object<可能为空>)),例如使用:RXP28资讯网——每日最新资讯28at.com

"bar".equals(foo)

而不是:RXP28资讯网——每日最新资讯28at.com

foo.equals("bar")

RXP28资讯网——每日最新资讯28at.com

(2) Java8或者guava lib中,提供了Optional类,这是一个元素容器,通过它来封装对象,可以减少判空。不过代码量还是不少。不爽。RXP28资讯网——每日最新资讯28at.com

RXP28资讯网——每日最新资讯28at.com

(3) 如果你想返回null,请停下来想一想,这个地方是否更应该抛出一个异常。RXP28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-10476-0.html别再用 “! = null” 做判空了!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 优化自动化接口测试:利用钩子函数增强HTTP请求处理

下一篇: HashMap 的基础结构,必须掌握!

标签:
  • 热门焦点
  • 把LangChain跑起来的三个方法

    把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 零售大模型“干中学”,攀爬数字化珠峰

    零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • Temu起诉SHEIN,跨境电商战事升级

    Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 自律,给不了Keep自由!

    自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 阿里大调整

    阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 北京:科技教育体验基地开始登记

    北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top
Baidu
map