似乎有越来越多的人说你永远不应该返回null,而应该总是使用Null对象模式.我可以在使用集合/ map /数组或调用boA函数(如isAuthenticated()时看到NOP的有用性,如下所示).
我没有发现任何完全令人信服的东西.当我试图组织我的想法时,请在这里忍受我.
我的理解是,不是返回一个空对象,而是返回一个已被"清零"的有效对象.
因此,例如,客户端将调用以获取对象:
Car car = getCar();
Run Code Online (Sandbox Code Playgroud)
如果不使用NOP,则需要在调用其上的任何方法之前检查从getCar()返回的对象是否为null:
if (car != null){
color = car.getColor();
doScreenStuff(color);
}
Run Code Online (Sandbox Code Playgroud)
使用NOP,getCar()它现在返回一个已被有效"清零"的对象,而不是返回null.所以现在我们不再需要做if (car != null),只能请求颜色.因此,我认为当我们调用颜色时,我们的"归零"对象将返回"无".
这有什么用?似乎向前移动并在空对象上调用方法会导致与仅检查null相同的痛苦.现在,当需要显示信息时,我们需要检查颜色是否为"无",高度不为0,或者您拥有的其他任何值.因此,基本上,如果汽车为空,则不检查处理的开始,而是检查我们拥有的汽车对象是真车还是替代品.IE我们不想显示一堆空对象,所以我们需要一些方法来过滤掉所有空对象.
这个过滤是一个额外的步骤,就像调用if(car!= null)一样.唯一的区别是,通过检查null,我们可以在通过抛出异常发现car对象为null时立即停止处理,而使用NOP我们在空对象上调用方法并继续前进,直到它到达时间为止显示对象,此时我们过滤掉空心.此外,您需要知道空对象返回的值.IE确实getColor()返回"none"或"empty".
显然必须有一些我忽略的东西.提前致谢.
Martin Fowler的Refactoring讨论了创建Null对象以避免大量的问题
if (myObject == null)
Run Code Online (Sandbox Code Playgroud)
试验.这样做的正确方法是什么?我的尝试违反了"构造函数中的虚拟成员调用"规则.这是我的尝试:
public class Animal
{
public virtual string Name { get; set; }
public virtual string Species { get; set; }
public virtual bool IsNull
{
get { return false; }
}
}
public sealed class NullAnimal : Animal
{
public override string Name
{
get{ return "NULL"; }
set { }
}
public override string Species
{
get { return "NULL"; }
set { }
}
public virtual bool IsNull
{
get { …Run Code Online (Sandbox Code Playgroud)