我最近在Null对象设计模式上观看了this youtube tutorial。即使它有一些错误:例如NullCar没有做任何事情会产生无限循环,这个概念得到了很好的解释。我的问题是,当可以为null的对象具有getter并在代码中使用时,您会怎么做?你怎么知道默认返回哪个值?或者我应该在所有对象中实现此模式?如果我需要返回字符串或基元怎么办?我是从Java角度谈论的。
编辑:我不会交易空对象测试默认值测试吗?如果没有,为什么不呢?
答案 0 :(得分:8)
Null对象的目标是避免在代码中使用Null引用。 Null Object getter返回的值取决于您的域。零或空字符串通常是合适的。
如果我们将Null对象模式转换为现实生活,你问的是什么类似于问“多大年纪没人?”。
也许您的设计可以改进,因为您似乎不遵循tell, don't ask原则。
编辑:Null Object design pattern通常在对象将行为委托给另一个对象时使用(例如在策略或状态设计模式中);正如Tom Hawtin - tackline评论的那样,对返回值的对象使用Special Case Objects。
答案 1 :(得分:4)
据我所知,这个想法是null对象的值尽可能接近“nothing”。不幸的是,你必须自己定义它。作为一个例子,我个人使用“”当我无法传递一个空字符串时,我的空对象数是-1(主要是因为默认情况下大多数数据库序列从1开始,我们使用那些作为项目id:sa很多-1是死的赠品它是一个空对象),列表/地图/设置它是Collections.EMPTY_SET
,EMPTY_MAP
或EMPTY_LIST
等等。如果我有自定义类,我必须从中创建一个空对象,我从中删除所有实际数据,看看它在哪里,然后应用我刚刚提到的内容,直到它为“空”。
所以你真的不知道默认返回哪个值,你只需要自己决定。
答案 2 :(得分:3)
当可以为null的对象具有getter并在代码中使用时,您会怎么做?你怎么知道默认返回哪个值?
您如何知道要实施哪些课程?这是一个设计问题,它取决于应用程序。
一般来说,NullObject模式的目的是在特殊情况下支持Replace Conditional with Polymorphism重构,其中条件是与编程语言的空值进行比较。
视频中示例的正确实现需要将driveCar
方法委派给Car
类。 SlowCar
和FastCar
类可以执行循环,可能是通过基类中的共享实现,而NullCar
将立即返回。
在Java上下文中,NullCar.speed
属性可能是一个未装箱的int。因此,将其设置为null
不是一种选择。我可能会隐藏访问者背后的属性,并NullCar.getSpeed
引发异常。任何需要测试以避免此异常的客户端代码都会转移到汽车类中。
委派直接依赖于速度值可用的所有操作是Tell Don't Ask提到的philippe面向对象设计原则的应用
答案 3 :(得分:0)
代码中Null设计模式的集成点应该是什么?我认为DAO对象是这个设计模式的fisrt级客户端,因为它们在数据库中查找实体并简单地返回它。
这些对象的可空性检查会污染服务层或命令层中实际访问和使用它们的代码。
请评论。
答案 4 :(得分:0)
它应该为您获得的类返回null对象。例如,如果您的类A
具有返回类B
的对象的getter,则相应的NullA
的getter应返回NullB
。