5

我最近看了这个关于 Null Object 设计模式的youtube 教程。尽管其中有一些错误:例如不做任何事情的 NullCar 创建了一个无限循环,但这个概念得到了很好的解释。我的问题是,当可以为 null 的对象具有 getter 并在您的代码中使用时,您会怎么做?你怎么知道默认返回哪个值?或者我应该在所有对象中实现这个模式?如果我需要返回字符串或原语怎么办?我是从 Java 的角度说的。

编辑:我不会为默认值测试交易空对象测试吗?如果没有,为什么不呢?

4

5 回答 5

8

Null 对象的目标是避免在代码中出现 Null 引用。Null Object getter 返回的值取决于您的域。零或空字符串通常是合适的。

如果我们将 Null Object 模式转换到现实生活中,您所问的问题类似于问“没人有多大年纪? ”。

也许你的设计可以改进,因为你似乎没有遵循告诉,不要问的原则。

编辑:当一个对象将行为委托给另一个对象(例如在策略或状态设计模式中)时,通常使用空对象设计模式;正如 Tom Hawtin - tackline 评论的那样,对返回值的对象使用特殊情况对象

于 2008-11-25T20:14:53.737 回答
4

据我了解,这个想法是空对象的值尽可能接近“无”。不幸的是,这意味着您必须自己定义它。举个例子,当我不能传递一个空字符串时,我个人使用“”,我的空对象编号是-1(主要是因为默认情况下大多数数据库序列从 1 开始,我们将这些用于项目 id:sa lot so -1是死赠品,它是一个空对象),列表/地图/集合它是Collections.EMPTY_SETEMPTY_MAP或者EMPTY_LIST等等等等。如果我有自定义类,我必须从中创建一个空对象,我会从中删除所有实际数据,看看它会把我带到哪里,然后应用我刚才提到的内容,直到它“空”。

所以你真的不“知道”默认返回哪个值,你只需要自己决定。

于 2008-11-25T20:10:25.773 回答
3

当可以为 null 的对象具有 getter 并在您的代码中使用时,您会怎么做?你怎么知道默认返回哪个值?

你怎么知道要实现哪些类?这是一个设计问题,它取决于应用程序。

一般而言,NullObject 模式的目的是在条件是与编程语言的空值进行比较的特殊情况下支持用多态性替换条件重构。

视频中示例的正确实现需要将driveCar方法委托给Car类。SlowCar和类将FastCar执行循环,大概是通过基类中的共享实现,并且NullCar会立即返回。

在 Java 上下文中,该NullCar.speed属性可能是未装箱的 int。因此,将其设置null为不是一种选择。我可能会将属性隐藏在访问器后面,并NullCar.getSpeed引发异常。任何需要测试以避免此异常的客户端代码都将移入汽车类。

委托直接依赖于可用速度值的所有操作是philippe提到的面向对象设计的告诉不问原则的应用

于 2008-11-25T20:21:18.107 回答
0

Null 设计模式在代码中的集成点应该是什么?我认为 DAO 对象是这种设计模式的第一级客户端,因为它们在数据库中查找实体并简单地返回它。

这些对象的可空性检查会污染实际访问和使用它们的服务层或命令层中的代码。

请给出意见。

于 2014-11-28T06:10:47.053 回答
0

它应该为您获得的类返回空对象。例如,如果您有一个A带有返回类对象的 getter 的类B,则相应NullA的 getter 应该返回NullB

于 2015-12-16T15:18:37.413 回答