需要通用方法进行空检查

时间:2018-10-15 11:42:04

标签: java core

我需要一种用于null检查的通用方法。我提出了一个要求。 这是我上课的设置方法:

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

我只想在存在值的情况下在placeHolderValues.setCurrentAddressCountry()中设置值。如果getApplicationDetailSO()getApplicantDetails()getAddressDetail()getCountry()中的任何一个为NULL,则必须在placeHolderValues.setCurrentAddressCountry()中设置NULL。我几乎有30种这样的二传手。

我需要一种通用的方法来实现相同的目标。

2 个答案:

答案 0 :(得分:4)

严重的非回答:不要那样做。

使用getA().getB().getC().getD()...getTheThingYouWant()确实是不好的做法。 这显然违反了Law Of Demeter

因此,除了您遇到的问题(关于检查null)之外,此类构造实际上是非常邪恶的。您会看到,使用此代码的类必须必须知道A有一个B,而B有一个C。依此类推。这直接将该类与所有类A,B,C等相结合。

real 的答案是避免此类更改。如果有的话,您进行getA().getMeWhatINeed()

唯一的另一种选择:在进入此类调用链之前,完全(先一步验证)您的输入数据。

答案 1 :(得分:2)

您可以使用Optional.ofNullable并将该值反复map转换为另一个,除非您在途中对null进行加密,然后获得最终值orElse {{1} }。

null

这仍然不是很漂亮,但是至少您不必重复不同的方法调用。其中一些lambda(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); )可能也可以用适当的Method引用代替。 (->)仍然比将行包装到::块中并trycatch包装起来要好。