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

拜托!不要用“ ! = null " 做判空了

时间:2023-03-21 17:13:27 科技观察

请!千万不要用"!=null"来做空判断;}...最终项目中会出现大量的空判断代码,丑陋繁琐!如何避免这种情况?我们是否滥用了空判断代码?最好的答案是,这是初学者和中级程序员经常遇到的问题。他们总是喜欢在方法中返回null,所以在调用这些方法的时候,要判断null。另外,或许是受这种习惯的影响,他们总是下意识地认为所有的回报都是不可信的,为了保护自己,程序中加入了很多空洞的判断。吐槽完,回到话题本身,评判空话。请区分以下两种情况:null是有效且有意义的返回值。(wherenullisavalidresponseinthetermsofcontract;and)nullisinvalid(Whereitisn'tavalidresponse.)你可能不明白这两句话的意思,别急,继续往下看,and那么我们将详细讨论这两种情况。①我们来说说第二种情况。Null是一个不合理的参数。您应该显式中断程序并抛出错误。这种情况在API方法中很常见。比如你开发一个接口,id是必须的参数,如果调用方不给你传这个参数,当然不行。你必须察觉到这种情况并告诉调用者“嘿,伙计,你把null传递给我是做什么的”。与null语句相比,更好的检查方式有两种:assert语句,你可以把错误的原因放到assert的参数中,这样不仅可以保护你的程序不宕机,还可以返回错误的原因来电者的错误,这不是一石二鸟吗。(原文介绍了assert的使用,此处省略)也可以直接抛空指针异常。上面说了,此时null是一个不合理的参数。有问题就是有问题,就该扔掉。②第一种情况会在这种情况下,null是一个“看似”合理的值。比如我查询数据库,在某个查询条件下没有对应的值。这时,null表达了“空”的概念。这里有一些做法建议①如果方法的返回类型是集合。当返回结果为空时,可以返回一个空的集合(emptylist),而不是返回null。这样调用方就可以大胆处理返回了。比如获取到返回后,调用方可以直接打印list.size(),不用担心空指针问题。什么?当你要调用这个方法的时候,你还记得你是否按照这个原则实现了这个方法吗?所以,代码习惯很重要!如果你养成这样写代码的习惯(返回空集合而不是返回null),你在调用自己写的方法时,可以大胆忽略空判断。②返回类型不是集合,怎么办?然后返回一个空对象(而不是null对象),下面我们来“举个栗子”,假设代码如下:publicinterfaceAction{voiddoSomething();}publicinterfaceParser{ActionfindAction(StringuserInput);其中Parse有一个接口FindAction,会根据用户的输入查找并执行相应的action。如果用户输入不正确,可能找不到对应的动作(Action),所以findAction会返回null,然后当动作调用doSomething方法时,就会出现空指针。解决这个问题的一种方法是使用空对象模式(nullobjectpattern)。我们修改类定义如下,这样在定义了findAction方法后,保证无论用户输入什么,都不会返回null对象:*/}};publicActionfindAction(StringuserInput){//...if(/*wecan'tfindanyactions*/){returnDO_NOTHING;}}}比较下面两个调用例子:①冗余:每获取一个对象,一个空的Parserparser=ParserFactory.getParser();if(parser==null){//现在是什么?//这将是一个wherenull不是(或不应该)avalidresponse的例子}Actionaction=parser.findAction(someInput);if(action==null){//什么都不做}其他{动作。doSomething();}②简化的ParserFactory.getParser().findAction(someInput).doSomething();因为无论什么情况,它都不会返回一个空对象,所以通过findAction获取到action之后,就可以放心的调用action方法了。其他答案选择①如果要使用equal方法,请使用object.equal(object))例如使用:"bar".equals(foo)而不是:foo。equals("bar")②在Java8或者guavalib中,提供了Optional类,它是一个元素容器,通过它可以封装对象,可以减少空判断。但是,代码量还是很多。准确的。③如果要返回null,请停下来想想这个地方是不是应该抛异常。作者:lizeyang编辑:陶佳龙来源:https://0x9.me/c3iwP