处理避免 NullPointerException 的链式方法调用 - 哪个是最好的方法?

gix*_*xlg 1 java

处理避免 NullPointerException 的链式方法调用 - 哪个是最好的方法?

让我们想象一下这种情景:3级MeetingRoomProjector

会议可能设置了一个房间,里面可能有一个投影仪。

现在假设我想知道投影仪的型号是什么。最自然的事情是做类似的事情

Meeting meeting = someMethod();
return meeting.getRoom().getProjector().getModelName();
Run Code Online (Sandbox Code Playgroud)

此代码可以正确返回投影仪的型号名称,不幸的是,此代码也可能导致异常:java.lang.NullPointerException如果包含在根类 Meeting(甚至 Meeting 类)中的类之一为空。

为了防止这个问题,并在最坏的情况下获得一个默认值,我们应该检查每个调用的返回值。

Meeting meeting = someMethod();
if (meeting != null) {
    Room room = meeting.getRoom();
    if (room != null) {
        Projector projector = room.getProjector();
        if (projector != null) {
            return projector.getModelName;
        }
    }
}
return "No Projector Exist";
Run Code Online (Sandbox Code Playgroud)

现在的代码非常糟糕。

处理这种避免 NullPointerException 的链式方法调用的最佳方法是什么?

Bor*_*der 6

使用Optional

return Optional.ofNullable(someMethod())
    .map(Meeting::getRoom)
    .map(Room::getProjector)
    .map(Projector::getModelName)
    .orElse("No Projector Exist");
Run Code Online (Sandbox Code Playgroud)

顺便说一句,请考虑返回Optionalnull从您的方法中返回- 必须将您String的值与特殊的硬编码值进行比较以检测null案例会变得令人厌烦......