当前位置: 首页 > 科技观察

为什么牛逼的程序员不用“!=null”来判断空呢?

时间:2023-03-13 05:16:41 科技观察

大家好,我是雷哥。为了避免空指针调用,我们经常会看到这样的语句:...if(someobject!=null){someobject.doCalc();}...最后会出现大量的空判断代码项目,多么丑陋和繁琐!如何避免这种情况?我们是否在滥用短判断?精华回答:这是初中级程序员经常遇到的问题。他们总是喜欢在方法中返回null,所以在调用这些方法的时候,要判断null。另外,或许是受这种习惯的影响,他们总是下意识地认为所有的回报都是不可信任的,为了保护自己的程序,他们加入了很多判断。吐槽过后,回到主题本身:做一个史无前例的判断,请区分以下两种情况:1.null是一个有效且有意义的返回值(其中null是合约条款中的有效响应;和)2.null是合同方面的有效回应;and)2.nullisInvalidandwrong(Whereitisn'tavalidresponse.)你可能不明白这两句话的意思,别着急,继续往下看,后面我们会讨论这两种情况detail,先说第二种情况null是一个不合理的参数,所以应该显式中断程序,抛出错误。这种情况在api方法中很常见。比如你开发一个接口,id是必填参数。如果调用者不给你传这个参数,当然不行。你必须察觉到这种情况并告诉调用者“嘿,伙计,你将null传递给我做什么”。与null语句相比,更好的检查方式是两条assert语句。可以把错误原因放在assert参数中,这样既可以保护你的程序不宕机,又可以把错误原因返回给调用方,岂不是一举两得。(介绍了assert的使用,这里省略)也可以直接抛空指针异常。上面说了,此时null是一个不合理的参数。有问题就是有问题,就该扔掉。第一种情况会更复杂。在这种情况下,null是一个“看似”合理的值。比如我查询数据库,在某个查询条件下没有对应的值。这时候null就可以看成是表示“空”了。概念。这里有一些实用的建议:1、如果方法的返回类型是集合,当返回结果为空时,可以返回一个空集合(空列表)而不是null,这样调用方可以大胆处理返回,比如调用方拿到return后,直接打印list.size()就可以了,不用担心空指针问题。(什么?当你要调用这个方法时,你还记得你在实现这个方法之前是否遵循了这个原则吗?所以,代码习惯很重要!如果你养成习惯,你总是这样写代码(返回空集合而不是null),调用自己写的方法时,可以大胆无视null判断)2.返回类型不是集合怎么办?然后返回一个空对象(而不是空对象)。这里有一个“栗子”。假设有如下代码publicinterfaceAction{voiddoSomething();}publicinterfaceParser{ActionfindAction(StringuserInput);}其中,Parse有一个接口FindAction,它会根据用户的输入,找到并执行相应的动作。如果用户输入不正确,可能找不到对应的动作(Action),所以findAction会返回null,然后当动作调用doSomething方法时,就会出现空指针。解决这个问题的一种方法是使用空对象模式(nullobjectpattern)。让我们修改类定义如下,这样在定义了findAction方法之后,我们将确保无论用户输入什么,都不会返回一个null对象/}};publicActionfindAction(StringuserInput){//...if(/*wecan'tfindanyactions*/){returnDO_NOTHING;}}}比较下面两个调用例子1.冗余:每次获取一个对象,都会判断为空);if(action==null){//donothing}else{action.doSomething();}2.简化ParserFactory.getParser().findAction(someInput).doSomething();因为无论什么情况,都不会返回一个空对象,所以通过findAction获取到action之后,就可以放心的调用action方法了。选择其他答案:1.如果要使用equal方法,请使用object.equal(object))比如使用:"bar".equals(foo)代替foo.equals("bar")2,Java8或者guavalib,提供了Optional类,它是一个元素容器,通过它可以封装对象,可以减少空判断。但是,代码量还是很多。准确的。3.如果要返回null,请停下来想想这个地方是不是应该抛异常