【问题标题】:Need generic way for null check [duplicate]需要进行空值检查的通用方法[重复]
【发布时间】:2018-10-15 11:42:03
【问题描述】:

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

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

我只想在值存在时在placeHolderValues.setCurrentAddressCountry() 中设置值。如果getApplicationDetailSO()getApplicantDetails()getAddressDetail()getCountry() 中的任何一个为NULL,那么我必须在placeHolderValues.setCurrentAddressCountry() 中设置NULL。我有将近 30 种这样的 setter。

我需要一个通用的方法来达到同样的效果。

【问题讨论】:

  • 不知道你用的是java 8吗?然后尝试使用 Optional,它是 nullpointerexception 的一个很好的解决方案,如果它为 null,您还可以提供默认值。
  • 所以问题是你的 getter 链可能会导致 NPE 并且你不想检查每个调用的结果?在那种情况下,正如 huy 已经建议的那样, Optional 确实是一种选择(没有双关语意)。
  • 我不确定为什么在被调用者中进行简单的空检查是不够的,但是我会注意到您的调用是上帝的调用,这是一种代码异味和 30 种不同或多或少做同样事情的 setter 可能会告诉你,代码架构很糟糕。

标签: java core


【解决方案1】:

这里有一个严重的不回答:不要那样做。

使用getA().getB().getC().getD()...getTheThingYouWant() 是非常糟糕的做法。 这明显违反了Law Of Demeter

所以除了你遇到的问题(关于检查空值)之外,这样的构造实际上是邪恶的。你看,使用这段代码的类必须知道 A 有一个 B。B 有一个 C。以此类推。这直接将这个类与所有类 A、B、C ......等等结合起来。

真正的答案是避免这种变化。如果有的话,您可以使用getA().getMeWhatINeed()

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

【讨论】:

  • 同意。在cmets中提到,这是一种常见的code-smell,见神行:en.wikipedia.org/wiki/Code_smell
  • @Mär 不客气!
  • @Mär 同意这是一种代码气味,但可能不是“神线”类型。毕竟,即使将行分成几行,问题仍然存在,如this question
  • @tobias_k Afaik 这是一个神线类型,仅仅是因为长度和可读性。
【解决方案2】:

你可以使用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);

这仍然不是很漂亮,但至少你不必重复不同的方法调用。其中一些 lambdas (->) 可能也可以替换为适当的方法引用。 (::) 不过,这可能比将行包装到 try 块和 catching NullPointerExceptoin 中更好。

【讨论】:

  • 这很好。而且您实际上可以删除 lambda,并使用方法引用,对吧?
  • @GhostCat 至少在某些情况下,但不适用于例如get(0).
  • 我有将近 3o 个二传手。我需要一个通用的方法来解决这个问题
  • 有道理。显然,当前的方法可读性很好。
  • @Ashwaniojha 不,老实说。您需要了解您正在尝试修复症状。含义:您需要解决方法,因为您的底层设计远非理想......
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2012-06-27
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多