【发布时间】:2012-01-23 07:26:33
【问题描述】:
已经是asked 单例和静态类有什么区别。但是,知道了区别,每次需要选择的时候我还是会感到困惑。
所以我为我自己定义了两种不同的情况——如果应该只有这个类的一个实例(很少见)和所有服务类的静态类(这经常发生)。
例如,在我的应用程序中,我需要存储消息(我有一个可序列化的类 Message),将它们写入文件,从文件中读取并在运行时访问。我看不出有什么理由在这里使用单例,静态类就可以了。唯一的静态类是 MessageStorage,它具有 3 个功能 - 读取、写入和 getMessages 以及一个静态私有消息数组列表。
这种方法合理吗?如果不合理,它的问题是什么?
【问题讨论】:
-
全局状态/静态通常被认为是不好的形式,这就是为什么单例通常被认为是antipattern。 “好的做法”是静态类和单例应该只用于没有状态的辅助方法(例如
Math.sqrt(4))。 -
那么在这种情况下你会怎么做呢?
-
在需要存储状态的情况下,您只需对对象的单个引用。这样的单例模式不能保证它,但它会位于需要该信息的任何东西都可以全局访问的位置。它将达到相同的效果,但正如我在帖子中所说,不同之处在于可扩展性和可变性随着需求的变化而得到改进。创建一个类一旦实现了单点目标,您需要做的就是在全局可找到的地方引用它。
-
如果您进行单元测试(这有助于说明为什么静态方法很烦人),您会注意到这并不容易或不可能?模拟测试静态方法。如果单元测试受到阻碍(即使您对此不感兴趣),这是一个巨大的警告信号,您的代码不够健壮并且无法很好地处理需求更改。
标签: java singleton static-class