怎么样实现对一个对象的深拷贝| Java Debug 笔记

169 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题:怎么样实现对一个对象的深拷贝

使用深拷贝的方法有点难实现啊。要保证原来的对象和克隆对象不是共享同一个引用的步骤是什么啊?

回答一

一种安全的方法是先序列化对象,然后反序列化。这保证了所有东西都是一个新的引用。

这里有一篇关于如何高效实现这个的文章。

注意:类可能会重写序列化的方法,这样就不会创建新的实例,例如对于单例来说,如果你的类不是可序列化的,这当然也不会生效啦。

回答二

实现深拷贝的一种方法是向每个关联的类添加复制构造函数。一个复制构造函数接受'this'的一个实例作为其单个参数,并从这个实例中复制所有值。这函数要干非常多的工作,但是也是非常直接和安全。

编辑:注意你不需要使用访问方法来读取属性。你可以直接访问所有属性,因为源实例总是与具有复制构造函数的实例具有相同的类型。这是很明显的,但可能会被忽视了。

例子:

public class Order {

    private long number;

    public Order() {
    }

    /**
     * Copy constructor
     */
    public Order(Order source) {
        number = source.number;
    }
}


public class Customer {

    private String name;
    private List<Order> orders = new ArrayList<Order>();

    public Customer() {
    }

    /**
     * Copy constructor
     */
    public Customer(Customer source) {
        name = source.name;
        for (Order sourceOrder : source.orders) {
            orders.add(new Order(sourceOrder));
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

注意,如果复制构造函数的话,你需要知道你复制的那个对象运行的时候是什么类型的。所以上面的方法,你不能简单第用来复制一个混合类型的list(你要用一些反射的代码去完成)

文章翻译自Stack Overflow:stackoverflow.com/questions/6…