gpt4 book ai didi

java - 检查链 "get"调用 null

转载 作者:IT老高 更新时间:2023-10-28 21:02:32 26 4
gpt4 key购买 nike

假设我想执行以下命令:

house.getFloor(0).getWall(WEST).getDoor().getDoorknob();

为避免 NullPointerException,如果出现以下情况,我必须执行以下操作:

if (house != null && house.getFloor(0) && house.getFloor(0).getWall(WEST) != null
&& house.getFloor(0).getWall(WEST).getDoor() != null) ...

有没有一种方法或已经存在的 Utils 类可以更优雅地做到这一点,让我们说如下?

checkForNull(house.getFloor(0).getWall(WEST).getDoor().getDoorknob());

最佳答案

如果您无法避免违反所选答案中所述的得墨忒耳法则 (LoD),并使用 Java 8介绍Optional ,这可能是处理诸如您的获取链中的空值的最佳做法。

Optional type 将使您能够连续管道多个映射操作(包含 get 调用)。在后台自动处理空检查。

例如,当对象没有被初始化时,不会产生 print() 并且不会抛出异常。我们在引擎盖下轻轻地处理这一切。初始化对象时,将进行打印。

System.out.println("----- Not Initialized! -----");

Optional.ofNullable(new Outer())
.map(out -> out.getNested())
.map(nest -> nest.getInner())
.map(in -> in.getFoo())
.ifPresent(foo -> System.out.println("foo: " + foo)); //no print

System.out.println("----- Let's Initialize! -----");

Optional.ofNullable(new OuterInit())
.map(out -> out.getNestedInit())
.map(nest -> nest.getInnerInit())
.map(in -> in.getFoo())
.ifPresent(foo -> System.out.println("foo: " + foo)); //will print!

class Outer {
Nested nested;
Nested getNested() {
return nested;
}
}
class Nested {
Inner inner;
Inner getInner() {
return inner;
}
}
class Inner {
String foo = "yeah!";
String getFoo() {
return foo;
}
}

class OuterInit {
NestedInit nested = new NestedInit();
NestedInit getNestedInit() {
return nested;
}
}
class NestedInit {
InnerInit inner = new InnerInit();
InnerInit getInnerInit() {
return inner;
}
}
class InnerInit {
String foo = "yeah!";
String getFoo() {
return foo;
}
}

所以,使用你的 getters 链,它看起来像这样:

Optional.ofNullable(house)
.map(house -> house.getFloor(0))
.map(floorZero -> floorZero.getWall(WEST))
.map(wallWest -> wallWest.getDoor())
.map(door -> wallWest.getDoor())

它的返回将类似于 Optional<Door>这将使您的工作更加安全,而不必担心空异常。

关于java - 检查链 "get"调用 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3458451/

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