知识卡片
空对象模式前提是能控制null的产生源头而非到处防御性判空
内容
空对象模式用一个什么都不做的默认实现类(如NullAnimal)替代null,去掉调用方的 防御性判空。但生效关键前提不是到处补空对象类,而是先想清楚可能为null的对象从哪里 产生——应在null产生源头(如MVC框架的对象映射逻辑)把默认值改成NullAnimal实例。发散: 这不只是”用空实现代替null”的技巧,更要求先定位控制null产生入口,否则只是把判空逻辑 搬到另一处,未真正简化系统。
参考来源
- 位置:《设计模式之禅(第2版)》第38章《新模式》38.5.1节(源文件:_epub-src/text/part0165.html)
- 结论依据:原文提出关键反问"在一个完整的系统中,animal对象是如何产生?什么原因会产生null值?如果我们能够控制住null值的产生,是不是就可以去掉这个空值判断了?",并举例"想象一个Web项目中,animal对象可能由MVC框架映射产生,我们只要定义一个默认的映射对象是NullAnimal,就可以解决空值判断的问题"。
- 原始内容:我们这样思考:在一个完整的系统中,animal对象是如何产生?什么原因会产生null值?如果我们能够控制住null值的产生,是不是就可以去掉这个空值判断了?……想象一个Web项目中,animal对象可能由MVC框架映射产生,我们只要定义一个默认的映射对象是NullAnimal,就可以解决空值判断的问题,提升代码的可读性。