2

假设我有一个名为的简单类WebsterDictionary,它有一个可以接受一个词并返回其定义的函数。也许还有另一个函数可以接受定义并返回一个单词。该类一直被许多客户使用。

为了便于查找,该类包含一个成员变量,它是一个内存字典,用于存储单词及其相关定义。假设字典一旦被初始化就永远不会改变——它是恒定的并且不会因实例而变化。

这是静态类的好人选吗?我一直在读静态类应该是无状态的......但是这个类有状态(内存字典)对吗?

编辑:另外,如果这确实成为一个静态类,我什么时候初始化 Dictionary 因为不再有构造函数?每次调用其中一个静态方法时,我是否会检查对 Dictionary 的引用是否为空?

谢谢。

4

8 回答 8

2

当功能不需要可替换时(例如,用于测试),静态类是合适的。如果您可能想使用存根或模拟,您应该创建一个适当的接口,然后用单例实现它。

于 2009-03-18T17:01:30.313 回答
1

为了扩展其他人的答案,当您只需要一个类的一个实例时,静态类或单例很有用当数据不可变时,这更容易实现。因此,您可能希望为此使用静态类。但它不一定是你想要使用的自动的情况。

我的建议是问自己一个问题:如果我实例化多个这些对象,世界会崩溃吗?如果是这样,请使用单例或静态类。否则,请使用常规课程。

于 2009-03-18T17:06:33.450 回答
1

静态类可能是您想要的(请参阅其他答案)。但是不要错误地称你的字典为“不可变的”。

在您使用短语的意义上,不可变并不意味着“在运行时永远不会改变” ,因为您的 Dictionary 实际上在运行时确实发生变化;在您必须创建它之后,您还必须添加项目。即使在这一点上,您也可能打算不再改变它,但有可能改变它。您的意图不会在任何地方强制执行。

真正的不可变对象在创建后无法更改,无论您如何尝试。相反,当您需要对象的变体时,您必须创建一个具有所需属性的新实例。

您可以在某种意义上将静态类视为只有一个实例。对于依赖于为每个状态更改创建新实例的模式,这可能不是最佳选择。

于 2009-03-18T17:08:00.030 回答
0

你可以选择单例或静态类。我可能会选择单身人士,但我认为在这种特殊情况下,这主要是一个偏好问题。

于 2009-03-18T16:57:45.470 回答
0

当只存在一个“实例”时,静态类是合适的,在这种情况下,单例模式可能更合适,也可能不合适(取决于细节)。对于需要多个实例的不可变对象,静态类当然是不合适的。

于 2009-03-18T16:59:27.010 回答
0

您正在寻找的可能是单例?

静态类不需要有状态(它可以有静态成员作为它的一部分,它可以是它的状态的一部分)。

于 2009-03-18T17:00:22.123 回答
0

这听起来很像您在描述Monostate 模式:您希望WebsterDictionary每个人都可以共享相同的模式。碰巧 theWebsterDictionary也是不可变的,但这是一个正交问题:只是使其无法更新(例如,通过使用只读包装器)。

于 2009-03-18T17:03:34.050 回答
0

正如您所说,该类持有某种形式的全局状态,即使它是只读的。采用 Singleton 方法可以清楚地表明它正在保存数据。

如果您使用依赖注入,您可以让它注入单例实例,而不是让所有类都具有获取实例的代码。这意味着其他类不会与 Singleton 方法相关联,并且如果您可以在测试时更轻松地替换它(结合接口以启用用测试模拟替换)。

于 2009-03-18T17:23:21.227 回答