3.9 空对象模式
空对象模式(Null Object)用一个实现了相同接口、但什么也不做(或返回中性值)的对象来代替 null。它让“缺失”变成一种合法的、可以被正常调用的行为,从而消灭散落各处的判空代码。
下面的实验切换“真实日志器 / 空日志器”,注意客户端那行 logger.log(...) 始终一模一样——空对象让调用方完全不必关心日志器是否存在。
正在加载交互实验...
让“没有”也能被安全调用
java
interface Logger { void log(String msg); }
class ConsoleLogger implements Logger {
public void log(String msg) { System.out.println(msg); }
}
class NullLogger implements Logger {
public void log(String msg) { /* 故意什么都不做 */ }
}
// 工厂永不返回 null
Logger getLogger() {
return enabled ? new ConsoleLogger() : new NullLogger();
}因为 NullLogger 也是合法的 Logger,客户端可以无脑调用 logger.log(...),不需要 if (logger != null)。下面的对照实验直观展示:引入空对象后,调用点的判空分支如何全部消失。
正在加载交互实验...
正在加载概念检查...
好处、边界与现代替代
好处:
- 消除重复且易漏的判空,调用代码更线性、更可读。
- 把“缺失时的默认行为”集中到一个类里,而不是散落在每个调用点。
边界:
- 它适合“缺失 = 什么都不做”这种良性默认。如果“缺失”本该是个错误(例如找不到关键配置),用空对象反而会悄悄吞掉 bug,这时让它显式失败更安全。
现代替代:很多语言提供了 Optional(Java)、Maybe、可空类型 + ?.(Kotlin/TS/C#)。它们和空对象殊途同归——都在系统化地处理“值可能不存在”这件事。
正在加载概念检查...
正在加载本节练习...