我更喜欢哪种模式?(涉及 IT 技术)

5
在我们的项目中,我们需要存储一些对象(例如User),并且User类必须具有验证标志(例如setOutdated和isOutdated等方法)。
有时,我们的User对象可能为null,但在这种情况下,验证标志必须是可访问的。可以从User类中提取这些方法,但由于语义的原因,该字段和方法必须在该类内部。
我发现了一些关于Null Object模式的文章(例如this),我想知道-是否可以创建一个Null Object(作为模式),它可以存储多个状态,如null outdated,null not outdated,not null outdated和not null not outdated。
PS:如果在我的类中引入“Outdated”字段,将很难清除对象而不是将其设置为null。

你不想在调用 isOutdated() 或类似的“状态检查器”之前先检查它是否为 null,有没有特别原因? - DejanLekic
即使用户为空,我仍然必须访问过时字段,因此我必须将该信息存储在某个地方。 - skayred
在这种情况下,我会简单地添加一个状态,比如说“readyToUse”,默认设置为false,并且只有当readyToUse为true时,才像它不是“null”一样使用对象。 - DejanLekic
2
当你的用户对象为空时,对于你的应用程序意味着什么?例如,是指“没有用户”,还是“某个未知用户”或“一个新用户”?通常这个问题的答案将帮助你设计一个空对象。 - Philipp Wendler
2个回答

2
我的第一个想法是添加一个UserUtil类(名称可以是其他任何名称)。
并添加一个方法,例如:
public static boolean isUserOutdated(User u){
return (u==null)? true :u.isOutdated();

}

 or return (u==null)? false :u.isOutdated(); depends on your businesslogic

在你的情况下它是否有效?

我不敢使用静态方法,因为在面向对象编程中似乎这是一种不好的实践。 - skayred
我认为对于一个工具类来说,静态方法是可以的。如果你真的讨厌静态方法,当然可以移除 "static" 并创建一个合适的构造函数。关键是,如果我在答案中提供的解决方案能在你的情况下工作呢? - Kent

2
你想区分“null已过时”和“null未过时”,其中包括其他内容。
这意味着你建议使用两个不同的Null对象,具有不同的行为。这违反了一个模式,即Null对象应该具有一种行为,即其类型未初始化对象的默认行为。

我建议你使用@Kent提供的解决方案,或者将你的用户对象设置为“PresentUser”和“FormerUser”对象。后者在技术上与你自己提出的解决方案相同,但它不是一个Null对象模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接