文章首发于公众号松花皮蛋的黑板报数据库
做者就任于京东,在稳定性保障、敏捷开发、高级JAVA、微服务架构有深刻的理解api
为了不空指针调用,咱们常常会看到这样的语句架构
if (someobject != null) { someobject.doCalc(); }复制代码
最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种状况?咱们是否滥用了判空呢?微服务
这是初、中级程序猿常常会遇到的问题。他们总喜欢在方法中返回null,所以,在调用这些方法时,也不得不去判空。另外,也许受此习惯影响,他们总潜意识地认为,全部的返回都是不可信任的,为了保护本身程序,就加了大量的判空。this
吐槽完毕,回到这个题目自己,进行判空前,请区分如下两种状况:spa
你可能还不明白这两句话的意思,不急,继续往下看,接下来将详细讨论这两种状况指针
先说第2种状况,null就是一个不合理的参数,就应该明确地中断程序,往外抛错误。这种状况常见于api方法。例如你开发了一个接口,id是一个必选的参数,若是调用方没传这个参数给你,固然不行。你要感知到这个状况,告诉调用方“嘿,哥们,你传个null给我作甚"。code
相对于判空语句,更好的检查方式有两个对象
第1种状况会更复杂一些。 这种状况下,null是个”看上去“合理的值,例如,我查询数据库,某个查询条件下,就是没有对应值,此时null算是表达了“空”的概念。blog
这里给一些实践建议:
public interface Action { void doSomething();} public interface Parser { Action findAction(String userInput);}复制代码
其中,Parse有一个接口FindAction,这个接口会依据用户的输入,找到并执行对应的动做。假如用户输入不对,可能就找不到对应的动做(Action),所以findAction就会返回null,接下来action调用doSomething方法时,就会出现空指针。 解决这个问题的一个方式,就是使用Null Object pattern(空对象模式)
咱们来改造一下
类定义以下,这样定义findAction方法后,确保不管用户输入什么,都不会返回null对象:
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; } }}复制代码
对比下面两份调用实例
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 { action.doSomething();}复制代码
ParserFactory.getParser().findAction(someInput).doSomething();复制代码
由于不管什么状况,都不会返回空对象,所以经过findAction拿到action后,能够放心地调用action的方法。
其余:
"bar".equals(foo)
而不是 foo.equals("bar")
文章来源:www.liangsonghua.me
做者介绍:京东资深工程师-梁松华,在稳定性保障、敏捷开发、JAVA高级、微服务架构方面有深刻的理解