Java 需要空检查的通用方法吗

Java 需要空检查的通用方法吗,java,core,Java,Core,我需要一个空检查的通用方法。我提出了一个要求。 这是我对类的setter方法: placeHolderValues.setCurrentAddressCountry(communicationSO.getApplicationDetailSO().getApplicantDetails().get(0).getAddressDetail().get(0).getCountry()); 仅当值存在时,我才想在placeholder values.setCurrentAddressCountry(

我需要一个空检查的通用方法。我提出了一个要求。 这是我对类的setter方法:

placeHolderValues.setCurrentAddressCountry(communicationSO.getApplicationDetailSO().getApplicantDetails().get(0).getAddressDetail().get(0).getCountry());
仅当值存在时,我才想在
placeholder values.setCurrentAddressCountry()
中设置值。如果
getapplicationDetails()
getapplicationDetails()
getAddressDetail()
getCountry()
中的任何一个为空,则我必须在
占位符值中设置空值。setCurrentAddressCountry()
。我有将近30种这样的二传手


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

这里有一个严重的错误答案:不要那样做

使用
getA().getB().getC().getD()…getTheThingYouWant()
是非常糟糕的做法。 这显然违反了法律

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

真正的答案是避免这种改变。如果有的话,可以执行
getA().getMeWhatINeed()


唯一的另一种选择是:在进入这样的呼叫链之前,完全验证输入数据(在前面的步骤中)。这里有一个严重的不回答:不要这样做

使用
getA().getB().getC().getD()…getTheThingYouWant()
是非常糟糕的做法。 这显然违反了法律

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

真正的答案是避免这种改变。如果有的话,可以执行
getA().getMeWhatINeed()

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

您可以使用并重复将值输入到另一个调用链中,除非您在途中遇到
null
,然后获得最终值
null

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(
->
)也可能被适当的方法引用所取代。(
)不过,这可能比仅仅将行包装成一个
try
块和
catch
要好,如果您在途中遇到
null
,然后获得最终值
null
,则可以使用并重复将该值放入另一个

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(
->
)也可能被适当的方法引用所取代。(
::
)不过,这可能比将行包装成
try
块和
catch
捕获
空点异常
要好。我想知道您是否在使用java 8?然后尝试使用Optional,它是nullpointerexception的一个很好的解决方案,如果它为null,你也可以提供默认值。所以问题是你的getter链可能会导致NPE,你不想检查每个调用的结果?在这种情况下,可选的确实是huy已经建议的一个选项(没有双关语的意图)。我不确定为什么在被调用方中进行简单的null检查是不够的,但是我会注意到,您的调用是一个god调用,这是一种代码气味,30个不同的setter,它们都或多或少做相同的事情,可能会告诉您,代码架构很糟糕。我想知道你是否在使用Java8?然后尝试使用Optional,它是nullpointerexception的一个很好的解决方案,如果它为null,你也可以提供默认值。所以问题是你的getter链可能会导致NPE,你不想检查每个调用的结果?在这种情况下,可选的确实是huy已经建议的一个选项(没有双关语的意图)。我不确定为什么在被调用方中进行简单的null检查是不够的,但是我会注意到,您的调用是一个god调用,这是一种代码气味,30个不同的setter,它们都或多或少做相同的事情,可能会告诉您,代码架构不好。请同意。正如评论中提到的,这是一种常见的代码气味,请看上帝的台词:@Mär非常欢迎您@Mär同意这是一种代码气味,但可能不是一种“神行”类型。毕竟,即使您将该行拆分为几行,问题仍然存在,如中所示。@tobias_k Afaik这是一种神行类型,只是因为长度和可读性。同意。正如评论中提到的,这是一种常见的代码气味,请看上帝的台词:@Mär非常欢迎您@Mär同意这是一种代码气味,但可能不是一种“神行”类型。毕竟,即使你把这行分成几行,问题仍然存在,如中所示。@tobias_k Afaik这是一种神行类型,仅仅是因为长度和可读性。这很好。实际上,您可以删除lambda并使用方法引用,对吗?@GhostCat至少在某些情况下是这样,但不能用于
get(0)
。我几乎有3o个setter。我需要一个通用的方法来解决这个问题。显然,目前的方法可读性很好。@Ashwaniojha不,老实说。您需要了解您正在尝试修复一个症状。意思是:你需要变通办法,因为你的基础设计远不是理想的……这很好。实际上,您可以删除lambda并使用方法引用,对吗?@GhostCat至少在某些情况下是这样,但不能用于
get(0)
。我几乎有3o个setter。我需要一个通用的方法来解决这个问题。显然,目前的方法可读性很好。@Ashwaniojha不,老实说。您需要了解您正在尝试修复一个症状。意思是:你在n