如何去除恼人的”!=null “

云栖息地编号信息:[点击查看更多行业信息]

在这里,您可以找到来自不同行业的第一手云信息。你还在等什么?来吧。

问题

为了避免空指针调用,我们经常会看到这样的语句

if (someobject!=null) {

some object . DoCalc();

}

最终,项目中会有大量的空白代码,这是丑陋和乏味的!如何避免这种情况?我们是否滥用了判决?

回答

这是初、中级程遇到的一个普遍问题。他们总是喜欢在方法中返回null,所以在调用这些方法时,他们也必须判断null。此外,也许受这种习惯的影响,他们总是下意识地认为所有的回报都是不可信的,并且为了保护自己的程序,他们添加了大量的空句子。

说出来后,回到主题本身,做出前所未有的判断。请区分以下两种情况:

Null是一个有效且有意义的返回值。和)

Null无效且不正确。

你可能还不明白这两句话的意思,别担心,继续往下看,然后详细讨论这两种情况。

先说第2种情况

Null是一个不合理的参数,您应该显式中断程序并抛出错误。这种情况在api方法中很常见。例如,您已经开发了一个接口,id是一个必需的参数,如果调用者没有把这个参数传递给您,当然没有。你必须感觉到这种情况,并告诉打电话的人“嘿,伙计,你为什么把空值传给我?”

有两种更好的方法来检查空句子

Assert语句,您可以将错误的原因放入assert的参数中,这不仅可以保护您的程序不崩溃,还可以将错误的原因返回给调用方,而不是一举两得。(原文介绍了assert的用法,这里省略了它)

您也可以直接抛出空指针异常。如上所述,此时null是一个不合理的参数。如果有问题,应该优雅地扔掉。

第1种情况会更复杂一些.

在这种情况下,null是一个“看似”合理的值。例如,在I查询数据库中,在某个查询条件下没有相应的值。在这种情况下,空是“空”概念的表达。

以下是一些实用的建议:

如何去除恼人的”!=null

如果返回类型不是集合怎么办?

然后返回一个空对象(不是空对象),并取下面的“栗”,假设代码如下

公共接口操作

void DosMething();}

公共接口分析器{

操作查找操作(字符串用户输入);}

其中,Parse有一个接口FindAction,它将根据用户的输入找到并执行相应的操作。如果用户输入不正确,可能找不到相应的操作,因此查找操作将返回空值,然后当操作调用doSomething方法时,将出现一个空指针。

解决这个问题的一个方式,就是使用Null Object pattern(空对象模式)

让我们改革它

该类定义如下。在以这种方式定义了findAction方法之后,可以确保无论用户输入什么都不会返回空对象:

公共类MyParser实现Parser {

私有静态操作无=新操作(){

public void DosMething(){/* nothing */}

};

公共操作查找操作(字符串用户输入){

//.

如果(/*我们找不到任何操作*/) {

不返回任何内容;

}

}

}

比较以下两个调用实例

1.冗余: 每获取一个对象,就判一次空

解析器解析器=解析器工厂. GetParser();

if (parser==null) {

//现在怎么办?

//这是null不是(或者不应该是)有效响应的一个例子

}

动作动作=parser . FindAction(SomeInput);

if (action==null) {

//什么也不做}

否则{

action . DosMething();

}

2.精简

解析器解析器()。查找操作(someInput)。do something();

因为无论在什么情况下,都不会返回空对象,所以在通过findAction获得操作后,您可以安全地调用操作方法。扩展:Java:如何更好地处理空值?

其他回答精选:

如果要使用equal方法,use对象不能为空。相等(对象可能为空))

例如:

使用

'bar '。等于(foo)

而不是

foo.equals('bar ')

在Java8或guava lib中,提供了一个可选类,它是一个元素容器,通过它可以封装对象以减少空句子。然而,仍然有很多代码。不开心。

如果你想返回空值,请停下来想想这个地方是否应该抛出一个异常。

[云起在线教室]产品和技术专家每天分享!

课程地址:https://yqh.aliyun.com/zhibo

立即加入社区,与专家面对面,并了解课程的最新进展!

[云栖在线课堂社区]https://c.tb.cn/F3.Z8gvnK

发布者:2020-04-15

作者:李泽洋

本文来源于“互联网建筑师微信公众号”。如果你知道相关信息,你可以关注“互联网建筑师”