首页 > 编程笔记 > Java笔记

克隆会破坏单例对象吗?

假设有这样一个场景,如果复制的目标对象恰好是单例对象,那会不会破坏单例对象呢?

当然,我们在已知的情况下肯定不会这么干,但如果发生了意外怎么办?不防来修改一下代码。
public class ConcretePrototype implements Cloneable {
    private static ConcretePrototype instance = new ConcretePrototype();

    private ConcretePrototype() {
    }

    public static ConcretePrototype getInstance() {
        return instance;
    }

    @Override
    public ConcretePrototype clone() {
        try {
            return (ConcretePrototype) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}
我们把构造方法私有化,并且提供 getInstance() 方法。编写客户端测试代码如下。
public static void main(String[] args) {
    //创建原型对象
    ConcretePrototype protoType = ConcretePrototype.getInstance();
    //复制原型对象
    ConcretePrototype cloneType = protoType.clone();
    System.out.println("原型对象和克隆对象比较"+(protoType==cloneType));
}
运行结果如下所示:

原型对象和克隆对象比较false

从运行结果来看,确实创建了两个不同的对象。实际上防止复制破坏单例对象的解决思路非常简单,禁止复制便可。那么我们的单例类不实现 Cloneable 接口,要么我们重写 clone() 方法,在 clone() 方法中返回单例对象即可,具体代码如下。
@Override
public ConcretePrototype clone() {
    return instance;
}

所有教程

优秀文章