如果您无法避免违反所选答案中所述的 Demeter 定律 (LoD),并且随着 Java 8 引入 Optional,那么在像您这样的 get 链中处理 null 可能是最佳实践。
该类型将使您能够通过管道传输一行中的多个映射操作(其中包含 get 调用)。空检查在引擎盖下自动处理。Optional
例如,当对象未初始化时,不会创建 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>