2008-11-25 68 views
5

我最近观看了空对象设计模式的this youtube tutorial。尽管它有一些错误:例如NullCar没有做任何事情就会产生无限循环,但这个概念很好解释。我的问题是,当可以为null的对象具有getter并在代码中使用时,你会做什么?你怎么知道默认返回哪个值?或者我应该在所有对象中实现这种模式?如果我需要返回字符串或原语呢?我从Java的角度谈论。空对象设计模式问题

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

回答

4

据我了解,它的想法是空对象的值尽可能接近“无”。不幸的是,你必须自己定义它。作为一个例子,我个人使用“”,当我不能通过一个空字符串,空对象编号对我来说是-1(主要是因为默认情况下大多数数据库序列从1开始,我们使用这些项目ID:很多,所以-1是死的赠品它是一个空对象),与列表/地图/集它的Collections.EMPTY_SET,EMPTY_MAPEMPTY_LIST等等。如果我有自定义类,我必须从中创建一个空对象,然后从中删除所有实际数据,然后查看我需要的内容,然后应用我刚刚提到的内容,直到它为空。

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

8

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

如果我们调换空对象模式到现实生活中,你所要求的是类似问“多大没人管?”。

也许你的设计可以改善,因为你似乎没有遵循tell, don't ask的原则。

编辑:Null Object design pattern通常用于当对象将行为委托给另一个对象时(例如在策略或状态设计模式中);正如Tom Hawtin - tackline所评论的那样,对于返回值的对象使用Special Case Objects

+0

我认为这将是更准确的评论,空对象模式的上下文更好地满足“告诉,不问”类型。对于值返回类型,您更有可能正在前往特殊情况对象。有可能。 – 2008-11-25 20:27:06

2

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

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

一般来说,NullObject模式的目的是在特殊情况下支持Replace Conditional with Polymorphism重构,其中条件是与编程语言的空值进行比较。

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

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

委派直接依赖于速度值是可用的是面向对象设计的原则Tell Don't Ask通过philippe

0

提到的应用程序应该是什么空设计模式的代码的结合点的所有操作?我认为DAO对象是这种设计模式的第一级客户端,因为它们在数据库中查找实体并简单地返回它。

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

请评论。

0

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