java 需要空值检查的通用方法[重复]

slhcrj9b  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(115)

此问题已在此处有答案

Java: avoid checking for null in nested classes (Deep Null checking)(13个回答)
4年前关闭。
我需要一个通用的方式为空检查。我提出了一个要求。这是一个类的setter方法:

placeHolderValues.setCurrentAddressCountry(communicationSO.getApplicationDetailSO().getApplicantDetails().get(0).getAddressDetail().get(0).getCountry());

我想在placeHolderValues.setCurrentAddressCountry()中只在值存在时设置值。如果getApplicationDetailSO()getApplicantDetails()getAddressDetail()getCountry()中的任何一个是NULL,那么我必须在placeHolderValues.setCurrentAddressCountry()中设置NULL。我有近30种这样的二传手。
我需要一个共同的方法来实现同样的目标。

46qrfjad

46qrfjad1#

这里有一个很严重的不回答:别那样做。
使用getA().getB().getC().getD()...getTheThingYouWant()是非常糟糕的做法。这显然违反了Law Of Demeter
因此,除了你遇到的问题(关于检查null),这样的结构是 * 真的实际上是邪恶的 *。你看,使用这段代码的类必须知道A有B。B后面有个C以此类推。这直接将这个类与所有类A、B、C、...等等。
真实的的答案是避免这种变化。如果有,则执行getA().getMeWhatINeed()
唯一的选择:验证您的输入数据完全(在前期步骤中),然后再进入此类调用链。

f1tvaqid

f1tvaqid2#

你可以使用Optional.ofNullable并重复地将map的值转换为另一个值,除非你在途中遇到null,然后得到最终值orElsenull

var value = Optional.ofNullable(communicationSO)
        .map(x -> x.getApplicationDetailSO())
        .map(x -> x.getApplicantDetails())
        .map(x -> x.get(0))
        .map(x -> x.getAddressDetail())
        .map(x -> x.get(0))
        .map(x -> x.getCountry())
        .orElse(null);
placeHolderValues.setCurrentAddressCountry(value);

这仍然不是很漂亮,但至少你不必重复不同的方法调用。其中一些lambda表达式(->)也可以用适当的方法引用来替换。(::)尽管如此,它可能比仅仅将行 Package 到try块中并将catch封装到NullPointerExceptoin中更好。

相关问题