Null-safe方法调用Java7。

11

我想获取有关Java7此特性的详细信息,类似于这段代码。

public String getPostcode(Person person)
{
    if (person != null)
    {
        Address address = person.getAddress();
        if (address != null)
        {
            return address.getPostcode();
        }
    }
    return null;
}

可以做类似这样的事情

public String getPostcode(Person person)
{
    return person?.getAddress()?.getPostcode();
}

但坦白说,我并不是很清楚。能否解释一下?


2
为什么需要用更短的方式来编写代码呢?在你的第一个示例中,它易于阅读和直观。 - Kon
1
@Kon 是的,没错。但是谁不想写简洁的代码呢? - Subodh Joshi
1
我认为该提案已被Java 7拒绝。你有官方文档的链接吗? - c.s.
@c.s. 检查一下问题部分,有人提供了链接,我也检查过,它在其他地方。 - Subodh Joshi
尽量避免返回 null。 - Thorbjørn Ravn Andersen
4个回答

14

Null-safe方法调用曾作为Java 7的Project Coin的一部分提出,但没有被包含在最终版本中。

在此处查看所有提出的功能和最终选定的内容 - https://wikis.oracle.com/display/ProjectCoin/2009ProposalsTOC


就简化该方法而言,你可以做一些小改变:

public String getPostcode(Person person) {

    if (person == null) return null;
    Address address = person.getAddress();
    return address != null ? address.getPostcode() : null;
}

我认为你无法比这更简洁明了了。个人认为,试图将该代码合并为一行,只会使代码变得不够清晰、不易阅读。


@subodh。你是什么意思? - Rohit Jain
你的意思是说这个功能在Java7中不可用,我们现在还无法实现它吗? - Subodh Joshi
@subodh。是的。请查看我回答中的链接。您将了解Java 7中添加了哪些功能。 - Rohit Jain
嗯,你的意思是如果Java7有这种特性,会增加编码人员的复杂度吗? - Subodh Joshi
@subodh。恩,关于这个问题我不是合适的人发表评论。我无法评价为什么某个功能被接受,或者为什么某些功能被拒绝。可能他们认为将其作为额外功能添加并不那么重要。或者可能这对语言的价值贡献不大。 - Rohit Jain
为什么在这里尝试/捕捉NPE不是更清晰的选择? - Eurig Jones

1
如果我理解你的问题正确,并且你想让代码更短,你可以利用短路运算符来编写:

如果我理解你的问题正确,并且你想让代码更短,你可以利用短路运算符来编写:

if (person != null && person.getAddress() != null)
    return person.getAddress().getPostCode();

如果第一个条件为假,那么第二个条件将不会被检查,因为 && 运算符在遇到第一个 false 时会短路逻辑。

4
除非您对 person.getAddress() 进行两次评估 :( - arshajii
3
不,这不是优化的问题(尽管如果 getAddress() 花费很长时间,也可能会涉及优化,但是假设它不会)。这段代码与原帖作者的代码不同。 - arshajii
如果 getAddress() 的主体涉及大量处理,第二次调用将是不可取的。在不知道该方法的实现的情况下,我们不能对一次调用与两次调用的优化质量做出假设。 - FThompson
仅供参考,我永远不会像我的回答这样编写代码。我更喜欢原始的OP编写的代码。但是,如果他的问题涉及以严格更短的方式编写某些内容,则我的回复应该在某种程度上有所帮助。希望如此。 - Kon
@Vulcan在意识到代码上的微小差异之前我就已经问过了。然而,如果我们不能做出某种假设,我们不应该急于认为另一种是更合法的。 - Fritz
你缺少了最后一行代码:return null; (或者 else return null; - bacar

0

如果你想避免调用两次getAddress,可以这样做:

Address address;
if (person != null && (address = person.getAddress()) != null){
      return address.getPostCode();
}

0

这应该适用于您:

public String getPostcode(Person person) {
    return person != null && person.getAddress() != null ? person.getAddress().getPostcode() : null;
}

还要查看这个线程:避免使用!= null语句


@NotNull将被Java7支持。 - Subodh Joshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接