曾经需要销毁单例实例吗?

2022-09-03 14:10:46

通过使用单一实例,只能创建它的一个实例。我们是否需要销毁该实例?

我有一个单例DBManager,它管理JDBC连接和查询操作。通过调用其静态newInstance方法,我可以获取它的实例,然后执行一些查询。最后,我想关闭数据库连接,并调用另一个静态方法 close 来关闭 JDBC 连接。

现在连接已关闭,而 DBManager 实例仍处于活动状态,但没有用。我是否需要通过例如将其分配给 null 来销毁它?否则,以后可能会被错误地引用。

如果我为该实例分配 null,然后再次调用 newInstance 方法,我会得到另一个新的不同实例吗?


答案 1

我不会纠结于“单例”的语义——你的要求是,在任何时候最多存在一个实例。一旦该实例变得无用,您可以销毁它,以便根据需要创建一个新实例,或者定义您的方法(我可能会建议重命名)以在单例变得无用后调用它(也许)。以抛出一个异常(也许)。DBManagernewInstancegetInstanceIllegalStateException

如果你打算在变得无用时销毁它,我建议在单例类中自动完成此操作,而无需外部帮助。您还应考虑完全隐藏单例并改为实现委派模式。这将避免客户端保留对过时实例的引用的问题。然后,可以将委托对象设置为常规单例。DBManagerDBManager


答案 2

我认为,,你不能销毁一个单例,因为需要始终有一个实例可用。可以说,它需要是相同的实例,因为否则它就不是真正的单例(例如,两个不同的类可以包含对类的不同实例的引用)。

但顺便说一句,这是我认为单例模式在实际软件中几乎没有用处的众多原因之一。在所有情况下,你只想要一件事,直到你通过阻止人们调用构造函数来强制执行这一点的几率太僵化了。这听起来像是一种情况,在某一时刻,拥有一个单例似乎是合理的,但现在很明显,多个实例是有意义的。

因此,请考虑这是否一定是单例 - 您能否简单地将其作为连接周围的包装器,并根据需要连接?


推荐