在大多数程序语言中,我们都需要与Null打交道,并且纠缠于对它的检查中。一不小心让它给溜出来,就可能像打开潘多拉的盒子一般,给程序世界带来灾难。说起来,在我们人类世界中,Null到底算什么“东西”呢?语义上讲,它就是一场空,即所谓“虚无”。这个世界并没有任何物质可以代表“虚无”,因而它仅存于我们的精神层面。说虚无存在其实是一种悖论,因为存在其实是虚无的反面。若从程序本质上讲,Null代表一种状态,指一个对象(或变量),虽获声明却未真正诞生,甚至可能永远不会诞生。而一旦诞生,Null就被抹去了,回归了正确的状态。
站在OO的角度来讲,既然Everything is object,自然可以将Null同样视为Object——这近似于前面提到的悖论,既然是Null,为何又是Object呢?换言之,在对象世界里,其实没有什么不存在,所谓“不存在”仍然是一种“存在”。这么说容易让人变糊涂,就好像我们搞不清楚“我是谁”。所以,我宁肯采用Martin Fowler的说法,将Null Object视为一种Special Case,即Null其实是一种特例。
视Null为一种特例,即可用OO的特化来表达。当某个对象可能存在Null这种状态时,都可以将这种状态表示为一种特化的类,它不再代表Null,而是代表“什么都不做”。凡是返回Null的地方,都替换为这个Null Object,用以表达这种Null其实仅仅是一种特列。于是乎,我们像抹杀异教徒一般抹去了“虚无”的存在。(当虚无被抹去,是什么样的存在?)
然而,若在程序语言中实现自己的Null Object,固然可以在一定程度上消除对Null的检查,却存在一些约束: