gpt4 book ai didi

java - 在 Java 中进行空检查的最优雅的方法是什么

转载 作者:行者123 更新时间:2023-11-29 09:32:39 25 4
gpt4 key购买 nike

举个例子,假设我们有如下代码:

String phone = currentCustomer.getMainAddress().getContactInformation().getLandline()

正如我们所知,Java 中没有 elvis 运算符并像这样捕获 NPE:

String phone = null;
try {
phone = currentCustomer.getMainAddress().getContactInformation().getLandline()
} catch (NullPointerException npe) {}

这不是任何人都会建议的。使用 Java 8 Optional 是一种解决方案,但代码远非清晰易读 -> 大致如下:

String phone = Optional.ofNullable(currentCustomer).flatMap(Customer::getMainAddress)
.flatMap(Address::getContactInformation)
.map(ContactInfo::getLandline)
.orElse(null);

那么,是否还有其他不牺牲可读性的稳健解决方案?

编辑:下面已经有一些好的想法,但我们假设模型是自动生成的(不方便每次更改)或在需要从中重建的第三方 jar 中要修改的源。

最佳答案

问题的“核心”

这个图案 currentCustomer.getMainAddress().getContactInformation().getLandline()叫做TrainWreck并且应该避免。如果您这样做了 - 不仅您将拥有更好的封装和更少的耦合代码,而且作为“副作用”,您将不必处理您当前面临的这个问题。

怎么做?

简单,类currentCustomer应该公开一个新方法:getPhoneNumber()这样用户可以调用:currentCustomer.getPhoneNumber()无需担心实现细节(因火车事故而暴露)。

它是否完全解决了我的问题?

没有。但现在您可以使用 Java 8 可选来调整最后一步。与问题中的示例不同,当返回值可能是 null 时,Optionals 用于从方法返回。 ,让我们看看它是如何实现的(在类 Customer 中):

Optional<String> getPhoneNumber() {
Optional<String> phone = Optional.empty();
try {
phone = Optional.of(mainAddress.getContactInformation().getLandline());
} catch (NullPointerException npe) {
// you might want to do something here:
// print to log, report error metric etc
}
return phone;
}

根据尼克下面的评论,理想情况下,方法 getLandline()会返回 Optional<String> ,这样我们就可以跳过吞噬异常的坏习惯(并且在我们可以避免的时候也引发它们),这也会使我们的代码更干净,更简洁:

Optional<String> getPhoneNumber() {
Optional<String> phone = mainAddress.getContactInformation().getLandline();
return phone;
}

关于java - 在 Java 中进行空检查的最优雅的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com