当前位置: 首页 > 后端技术 > Java

摆脱烦人的!=null

时间:2023-04-01 22:35:42 Java

译者:lizeyang本文来源:blog.csdn.net/lizeyang/article/details/40040817问题为了避免空指针调用,我们经常会看到这样的语句if(someobject!=null){someobject.doCalc();}最后,项目中会出现大量的null判断代码,丑陋繁琐!如何避免这种情况?我们是否在滥用短判断?回答这是初、中级程序员经常遇到的问题。他们总是喜欢在方法中返回null,所以在调用这些方法的时候,要判断null。另外,或许是受这种习惯的影响,他们总是下意识地认为所有的回报都是不可信任的,为了保护自己的程序,他们加入了很多判断。抱怨过后,回到话题本身,做出前所未有的判断。请区分以下两种情况:null是有效且有意义的返回值(Wherenull是合同条款中的有效响应;和)null是无效错误的(Whereitisn'tavalidresponse.)你可能不理解这两句话的意思,不用着急,继续往下看,后面我会详细讨论这两种情况。首先,第二种情况为空。合理的参数应该明确地中断程序并抛出错误。这种情况在api方法中很常见。比如你开发一个接口,id是必填参数。如果调用者不给你传这个参数,当然不行。你必须察觉到这种情况并告诉调用者“嘿,伙计,你将null传递给我做什么”。与null语句相比,更好的检查方式是两条assert语句。可以把错误原因放在assert参数中,这样既可以保护你的程序不宕机,又可以把错误原因返回给调用方,岂不是一举两得。(原文介绍了assert的使用,这里从略)也可以直接抛空指针异常。上面说了,此时null是一个不合理的参数。有问题就是有问题,就该扔掉。第一种情况会更复杂。在这种情况下,null是一个“看似”合理的值。比如我查询数据库,在某个查询条件下没有对应的值。这时候null就可以看成是表示“空”了。概念。下面是一些实用的建议:如果方法的返回类型是集合,返回结果为空,可以返回一个空集合(空列表),而不是返回null。这样调用方就可以大胆的处理这个返回,比如调用方收到返回后直接打印list.size()就可以了,不用担心空指针问题。(什么?当你要调用这个方法时,你还记得你在实现这个方法之前是否遵循了这个原则吗?所以,代码习惯很重要!如果你养成习惯,你总是这样写代码(返回空集合而不是null),调用自己写的方法时,可以大胆无视null判断)返回类型不是集合怎么办?然后返回一个空对象(而不是空对象),下面我们来“举个栗子”,假设如下代码publicinterfaceAction{voiddoSomething();}publicinterfaceParser{ActionfindAction(StringuserInput);}其中,Parse有一个接口FindAction,这个接口会根据用户的输入查找并执行相应的动作。如果用户输入错误,可能找不到对应的动作(Action),所以findAction会返回null,然后当动作调用doSomething方法时,就会出现空指针。解决这个问题的一种方法是使用NullObjectpattern(空对象模式)。我们修改类定义如下,这样在定义了findAction方法后,保证无论用户输入什么,都不会返回null对象:publicclassMyParserimplementsParser{privatestaticActionDO_NOTHING=newAction(){publicvoiddoSomething(){/*什么都不做*/}};publicActionfindAction(StringuserInput){//...if(/*我们找不到任何动作*/){returnDO_NOTHING;}}}比较下面两个调用例子1.冗余:每次获取一个对象,都会判断一个空的Parserparser=ParserFactory.getParser();if(parser==null){//现在怎么办?//这将是null不是(或不应该是)有效响应的示例}Actionaction=parser.查找操作(一些输入);if(action==null){//什么都不做}else{action.doSomething();}2.简化的ParserFactory.getParser().findAction(someInput).doSomething();因为无论什么情况,它都不会返回一个空对象,所以通过findAction获取到action之后,就可以放心的调用action的Methods了。其他答案选:如果要用equal方法,请用object.equal(object))例如:用"bar".equals(foo)代替foo.equals("bar")在Java8或者guavalib中,提供了Optional类,它是一个元素容器,通过它可以封装对象,可以减少空判断。但是,代码量还是很多。准确的。如果要返回null,停下来想想这个地方是不是应该抛异常。Stackoverflow链接:http://stackoverflow.com/questions/271526/avoiding-null-statements-in-java?page=2&tab=votes#tab-top奇比是一个专注于程序员圈的技术平台,你可以获取最新的技术动态、最新内测资质、BAT等大厂经验、自我成长、学习资料、职业路径、赚钱思维。微信搜索倪峰关注!