假设我有一个名为WebsterDictionary
的简单类,它有一个可以接受单词并返回其定义的函数。也许还有另一个函数可以定义并返回一个单词。该课程一直被许多客户使用。
为了便于查找,该类包含一个成员变量,它是一个内存中的Dictionary,用于存储单词及其相关定义。假设字典在初始化后永远不会改变 - 它是常量,并且不会因实例而异。
这是静态类的好候选人吗?我一直在读静态类应该是无状态的......但是这个类有状态(内存中的字典)吗?
编辑:此外,如果这确实成为静态类,我何时初始化字典,因为不再有构造函数?每次调用其中一个静态方法时,是否检查是否对Dictionary的引用为空?
感谢。
答案 0 :(得分:2)
当功能不需要可替换时(例如,用于测试),静态类是合适的。如果您可能想要使用存根或模拟,您应该创建一个合适的接口,然后使用单例实现它。
答案 1 :(得分:1)
要扩展其他人的答案,当您只需要一个类的一个实例时,静态类或单例 非常有用。当数据不可变时,这更容易实现。因此,您可能希望使用静态类。但并不一定就是你想要自动使用它。
我的建议是问自己一个问题:如果我实例化多个这些对象,世界会崩溃吗?如果是这样,请使用单例或静态类。否则,请使用常规课程。
答案 2 :(得分:1)
静态类可能就是你想要的(参见其他答案)。但是不要错误地将你的词典称为“不可变的”。
不可变并不意味着“在运行时永远不会改变”在你使用短语的意义上,因为你的词典实际在运行时改变了;必须创建它之后,还必须添加项目。即使在这一点上你也可以打算它永远不会再改变,但是可能来改变它。你的意图不会在任何地方强制执行。
真正的不可变对象在创建后无法更改,无论您尝试多少。相反,当您需要对象的变体时,您必须创建具有所需属性的新实例。
在某种意义上,您可以将静态类视为只有一个实例。对于依赖于为每个状态更改创建新实例的模式而言,这可能不是最佳选择。
答案 3 :(得分:0)
你可以选择Singleton或Static类。我可能会选择Singleton,但我认为在这种特殊情况下,这主要是一个偏好问题。
答案 4 :(得分:0)
当只有一个“实例”存在时,静态类是合适的,在这种情况下,Singleton模式可能更合适也可能不合适(取决于细节)。对于一个你需要多个实例的不可变对象,当然静态类是不合适的。
答案 5 :(得分:0)
您正在寻找的可能是Singleton?
静态类不必具有状态(它可以将静态成员作为其一部分,这可以是其状态的一部分)。
答案 6 :(得分:0)
这听起来非常像您在描述Monostate pattern:您希望每个人都能分享同一个WebsterDictionary
。只是恰好WebsterDictionary
也是不可变的,但这是一个正交问题:只是让它无法更新(例如,通过使用只读包装器)。
答案 7 :(得分:0)
正如你所说的那样,即使它是只读的,这个班级也会持有某种形式的全球状态。采用Singleton方法可以很清楚地保存数据。
如果你使用依赖注入,你可以让它注入单例实例,而不是让所有类都有代码来获取实例。这意味着其他类不会与Singleton方法相关联,并且如果您在测试时可以更容易地替换它(与用于替换测试模拟的接口相结合)。