似乎有越来越多的人说您永远不应该返回 null,而应该始终使用 Null 对象模式。在使用集合/映射/数组或调用诸如 isAuthenticated() 之类的布尔函数时,我可以看到 NOP 的用处,此处显示。
我在这方面还没有找到任何令人信服的东西。在我尝试整理我的想法时,请耐心等待。
我的理解是,您不是返回一个空对象,而是返回一个已“归零”的有效对象。
例如,客户端会调用来获取一个对象:
Car car = getCar();
如果不使用 NOP,则需要在调用任何方法之前检查从 getCar() 返回的对象是否为 null:
if (car != null){
color = car.getColor();
doScreenStuff(color);
}
使用 NOP,而不是getCar()
返回 null,它现在返回一个有效地“清零”的对象。所以现在我们不再需要做if (car != null)
,只需请求颜色即可。所以,我想当我们调用颜色时,我们的“归零”对象会返回“无”。
这有什么帮助?似乎向前移动并在空对象上调用方法会导致与检查 null 一样多的痛苦。现在,当需要显示信息时,我们需要检查颜色是否为“无”,高度是否为 0,或者您拥有的任何其他值。所以本质上,不是在处理开始时检查汽车是否为空,而是在之后检查我们拥有的汽车对象是真车还是替代品。IE我们不想显示一堆空对象,所以我们需要一些方法来过滤掉我们所有的空对象。
此过滤是一个附加步骤,就像调用 if (car != null) 一样。唯一的区别是,通过检查 null,我们可以通过抛出异常来在发现 car 对象为 null 时立即停止处理,而使用 NOP,我们会调用空对象上的方法并继续运行,直到时间到了显示对象,此时我们过滤掉空对象。此外,您需要知道空对象返回的值。IE 确实 getColor() 返回“无”或“空”。
显然必须有一些我忽略的东西。提前致谢。