dom*_*aru 4 java nullable nullpointerexception option-type
举个例子,假设我们有如下代码:
String phone = currentCustomer.getMainAddress().getContactInformation().getLandline()
Run Code Online (Sandbox Code Playgroud)
众所周知,Java 中没有 elvis 运算符,并且可以像这样捕获 NPE:
String phone = null;
try {
phone = currentCustomer.getMainAddress().getContactInformation().getLandline()
} catch (NullPointerException npe) {}
Run Code Online (Sandbox Code Playgroud)
没有人会建议。使用 Java 8Optional是一种解决方案,但代码远不够清晰可读 -> 大致如下:
String phone = Optional.ofNullable(currentCustomer).flatMap(Customer::getMainAddress)
.flatMap(Address::getContactInformation)
.map(ContactInfo::getLandline)
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
那么,是否还有其他稳健且不牺牲可读性的解决方案呢?
编辑:下面已经有一些好的想法,但让我们假设模型是自动生成的(不方便每次更改)或在第三方 jar 中,需要从源重建才能修改。
这种模式 currentCustomer.getMainAddress().getContactInformation().getLandline()称为TrainWreck,应该避免。如果您这样做了,您不仅可以获得更好的封装和更少的耦合代码,而且作为“副作用”,您将不必处理当前面临的这个问题。
很简单, 的类currentCustomer应该公开一个新方法:getPhoneNumber()这样用户就可以调用:currentCustomer.getPhoneNumber()而不必担心实现细节(由火车残骸公开)。
不。但现在您可以使用 Java 8 可选来调整最后一步。与问题中的示例不同,当返回值可能为 时,Optional 用于从方法返回null,让我们看看如何实现它(在 class 内部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;
}
Run Code Online (Sandbox Code Playgroud)
根据下面 Nick 的评论,理想情况下,该方法getLandline()将返回一个Optional<String>,这样我们就可以跳过吞噬异常的不良做法(并且在可以避免异常时引发异常),这也将使我们的代码更干净、更简洁:
Optional<String> getPhoneNumber() {
Optional<String> phone = mainAddress.getContactInformation().getLandline();
return phone;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
761 次 |
| 最近记录: |