是否可以为每个类创建一个空对象? (当然要借助工具)

2024-01-09

The 空对象模式 http://en.wikipedia.org/wiki/Null_Object_pattern旨在成为"safe"(中立)行为。

这个想法是创建一个不执行任何操作的对象(但也不抛出 NullPointerException )

例如,类定义为:

class Employee {
    private String name;
    private int age;
    public String getName(){ return name; }
    public int getAge()    { return age;  }
}  

在此代码中会导致 NullPointerException:

 class Other {
      Employee oscar;

      String theName = oscar.getName(); // NPE

 }

NOP 所说的是,你可以拥有这样的对象:

 class NullEmployee extends Employee {
      public static final  Employee instance = new NullEmployee(); 
      public String getName(){ return ""; }
      public int getAge()    { return 0;  }
 }

然后将其用作默认值。

 Employee oscar = NullEmployee.instance;

问题来了,当您需要为创建的每个类重复代码时,解决方案就是使用一个工具来创建它。

创建或使用这样的工具(如果存在)是否可行/合理/有用?

也许使用 AOP 或 DI 可以自动使用默认值。


对我来说,空对象模式感觉就像是安慰剂。真实对象和空对象可能具有完全不同的含义,但行为非常相似。就像安慰剂一样,空对象会欺骗你,让你相信没有什么问题,但有什么问题could就大错特错了。

我认为这是一个很好的做法早早失败并且经常失败。最后,您需要在某处区分真实对象和空对象,此时这与检查null指针。

来自维基百科文章 http://en.wikipedia.org/wiki/Null_Object_pattern:

与工作默认实现相比,这种方法的优点是空对象非常可预测并且没有副作用:nothing.

它不会指出任何problems任何一个。想象一下当空对象在您的应用程序中一路传播时会发生什么。然后,在某个时刻,您的应用程序期望对象执行某些行为,而空对象实现无法提供这些行为。那时您的应用程序可能会崩溃或进入无效状态。你将会有一个很难追踪空对象的起源. A null指针会在一开始就抛出异常,从而将您的注意力直接吸引到问题的根源。

维基百科文章给出的唯一例子是一个空集合而不是null。这是一个非常好的实践,但却是空对象模式的一个糟糕的例子,因为它处理的是对象的集合,而不是单个实例。

简而言之,我确信为所有类创建空对象实现是可行的,但我强烈建议不要这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以为每个类创建一个空对象? (当然要借助工具) 的相关文章

随机推荐