单例设计模式和防止克隆

2022-09-01 17:13:12

我在网络上读到的许多关于单例设计模式的文章都提到,该类应该覆盖'clone()'方法,并在其中抛出'CloneNotSupported'异常。这真的有必要吗?

默认情况下,clone() 方法受保护,因此任何类(同一包中的类除外)都无法在该 Singleton 实例上调用它。另外,如果此 Singleton 未实现 Cloneable,则即使调用此方法,它也将给出运行时异常。另外,构造函数是私有的,我们将无法对其进行子类化,从而允许其克隆。那么,我是否仍应为我的 Singleton 类实现此建议?

编辑:只是为了澄清:我不是在寻找实现单例的最佳方法。我只是在问上面提到的建议的有效性,w.r.t“正常”的单例模式(而不是基于枚举的单例)。


答案 1

如果你真的要实现一个单例,使用一个单元素枚举,不要再考虑它了。


编辑:只是为了澄清:我不是在寻找实现单例的最佳方法。我只是在问上面提到的建议的有效性,w.r.t“正常”的单例模式(而不是基于枚举的单例)。

既然你有有效的Java,那么你应该已经意识到了 的陷阱和问题。也就是说,如果您要实现单例的“错误”方式之一,不,绝对没有任何理由实现和覆盖只是为了抛出。Object#clone()接口不存在时已经这样做了。CloneableCloneableObject#clone()CloneNotSupportedExceptionCloneable


答案 2

@shrini1000, 您有一个有效的问题,但关于克隆的建议非常特定于以下条件

public Object clone() throws CloneNotSupportedException {
    throw new CloneNotSupportedException(); 
}

仅当单例类的超类实现公共 clone() 方法时,才需要上述内容