【发布时间】:2021-05-30 11:01:26
【问题描述】:
希望您能帮助我解决我的问题。实际上我知道有解决方案(例如 nullchecking),但我正在寻找一个超级优雅的解决方案!在最好的情况下,单线。希望你能帮助我。
现在我将通过简单的例子来描述这个问题。
情况描述
我有一个 Java 对象,它包含其他简单成员变量旁边的其他 Java 对象(嵌套 Java 对象)。
类商店:
- 字符串名称
- 字符串城市
- 员工员工
班级员工:
- 字符串名称
- 整数年龄
- 银行账户银行账户
...等等。
可以看到 Store 对象 -> 包含:Employee 对象 -> 包含:BankAccount 对象。
问题
要从 Store 对象中调用 Employee 的年龄,我会这样做:
Store.getEmployee().getAge();
或者如果我想要银行账户 IBAN,我必须这样做
Store.getEmployee().getBankAccount().getIban();
但是,如果商店有没有员工,.getEmployee() 将导致NullPointerException。
银行账户也一样。
当然可以
if(Store.getEmployee() != null) {
if(Store.getEmployee().getBankAccount() != null) {
System.out.println(Store.getEmployee().getBankAccount().getIban();
}
}
但这太烦人了。
有没有更简单的解决方案?
注意:选项也不起作用,因为
Optional.ofNullable(Store.getEmployee().getBankAccount().getIban().orElse("");
当 Store.getEmployee() 已经导致异常时不起作用。
编辑 请注意,对象本身不应成为解决方案的一部分。当然,您可以修改对象以便返回一个可选的或自己进行空值检查。 这背后的原因是您只是获取对象并处理它们,但不允许配置它们。
【问题讨论】:
-
让 getEmployee 返回一个可选项。
-
@ThorbjørnRavnAndersen hm,如果对象定义由另一个部门处理并且我不允许更改它们?
-
那么不要做一个衬垫。每次检查。这需要您捕获变量中的值。正确执行此操作。你现在越小心,你的软件就会越健壮。
-
如您所见,您的 Optional 方法不起作用。如果你想使用 Optional,你应该使用类似:
Optional.ofNullable(Store.getEmployee()).map(Employee::getBankAccount).map(BankAccount::getIban).orElse(""). -
您好,欢迎您! :-) 这(不)回答你的问题:stackoverflow.com/q/10391406/592355 ?? ..xD
标签: java nullpointerexception optional getter-setter