Java 实体对象拷贝

在Java开发中,我们经常需要将一个实体对象的数据拷贝到另一个实体对象中。实体对象之间的数据拷贝可以有多种方式,本文将介绍几种常见的实体对象拷贝方法,并给出相应的代码示例。

1. 浅拷贝

浅拷贝是指将一个对象的字段值复制到另一个对象中,两个对象的引用指向同一个对象。浅拷贝的特点是只复制对象的引用而不复制引用指向的对象本身。当被拷贝对象中存在引用类型的字段时,拷贝的结果可能会影响原对象。

下面是一个使用浅拷贝实现实体对象拷贝的示例代码:

public class Student implements Cloneable {
    private String name;
    private int age;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    public Student clone() throws CloneNotSupportedException {
        return (Student) super.clone();
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student student1 = new Student("Tom", 18);
        Student student2 = student1.clone();

        student2.setName("Jerry");
        student2.setAge(20);

        System.out.println("student1: " + student1.getName() + " " + student1.getAge());
        System.out.println("student2: " + student2.getName() + " " + student2.getAge());
    }
}

上述代码中,通过实现 Cloneable 接口并重写 clone 方法,实现了浅拷贝。student1student2 引用了同一个对象,当修改 student2 的字段时,student1 的字段也会受到影响。

2. 深拷贝

深拷贝是指将一个对象的字段值复制到另一个对象中,且两个对象的引用指向不同的对象。深拷贝的特点是复制对象的所有字段,包括引用类型的字段的拷贝。

下面是一个使用深拷贝实现实体对象拷贝的示例代码:

public class Student implements Cloneable {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public Student clone() throws CloneNotSupportedException {
        Student student = (Student) super.clone();
        student.name = new String(this.name);
        return student;
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student student1 = new Student("Tom", 18);
        Student student2 = student1.clone();

        student2.setName("Jerry");
        student2.setAge(20);

        System.out.println("student1: " + student1.getName() + " " + student1.getAge());
        System.out.println("student2: " + student2.getName() + " " + student2.getAge());
    }
}

上述代码中,通过重写 clone 方法实现了深拷贝。在 clone 方法中,对引用类型的字段进行了拷贝,保证了拷贝的结果不会影响原对象。

3. 使用第三方库

除了手动实现浅拷贝和深拷贝外,还可以使用第三方库来简化实体对象的拷贝过程。常用的第三方库包括 BeanUtilsApache Commons LangSpring Framework 等。

下面是一个使用 BeanUtils 实现实体对象拷贝的示例代码:

import org.apache.commons.beanutils.BeanUtils;

public class Student {
    private String name;
    private int age;

    // getters and setters

    public static void main(String[] args) throws Exception {
        Student student1 = new Student();
        student1.setName("Tom");
        student1.setAge(18);

        Student student2 = new Student();
        BeanUtils.copyProperties(student2, student1);

        student2.setName("Jerry");
        student2.setAge(20);

        System.out.println("student