为什么要用null对象替换null文字?

时间:2017-01-21 19:29:17

标签: java refactoring

我们正在使用的方法,不能对其进行任何更改。

void existingMethod(String p1, String p2){
    if(p1==null)
        p1 = makeP1();
    //do work
}

我从我的代码中调用了该方法,

existingMethod(null, "dfdfdf");

我收到了评论评论以创建String NULL_STRING = null,并在我的代码中使用该变量而不是null字面值。你如何证明这一点?

编辑:这仅仅是为了可读性吗?然后我有类似的方法,Long amount,和一些函数,我们传递null。如何对NULL_AMOUNT执行相同的操作?

4 个答案:

答案 0 :(得分:2)

这是关于代码风格的问题。我不建议这样做,但推理可能是可扩展性。

想象一下有人引入了该方法的新重载:

void existingMethod(OtherClass p1, String p2) {
   ...
}

现在existingMethod(null, "dfdfdf");导致编译错误,而existingMethod(NULL_STRING, "dfdfdf");则没有。

答案 1 :(得分:1)

这类问题总有两种观点:

  1. 他们讲的是“风格”;和风格总是取决于你的团队是否同意遵循的标准。
  2. 还有影响某些方面(例如可读性)的“一般”最佳实践。
  3. 换句话说:当你团队中的每个人都期望使用一些TYPED_NULL_CONST而不是null时,那么这可能是最佳选择。

    但另一方面,团队之外的大多数人会发现这个政策非常尴尬。

    从这个意义上讲:与评论评论的人交谈,看看它的来源;而背后的想法是什么。然后处理它。

    并且为了记录:我们的团队更喜欢既不采用null也不返回null的方法。

答案 2 :(得分:1)

existingMethod的实施值得怀疑,因为它需要null个值。技术上 - 嗯,它有效。

但我至少提供了像

这样的重载方法
void existingMethod(String p2) {
    existingMethod(null, p2)
}

通常 - 所谓的null对象是很好的做法。这是一种立即避免大量NPE的方法。但我同意评论员的意见,宣布发送真实null的常数是......废话。

答案 3 :(得分:1)

为了得到一点迂腐,你不会被要求使用Null对象。正如@GhostCat所说,你有一个Typed Null Constant。 Null Object Pattern使用任何类型的实际对象,在调用方法时不执行任何操作。它可以传递而不是null。我自己在Typed Null Constant中看不到多少价值。