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
方法,实现了浅拷贝。student1
和 student2
引用了同一个对象,当修改 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. 使用第三方库
除了手动实现浅拷贝和深拷贝外,还可以使用第三方库来简化实体对象的拷贝过程。常用的第三方库包括 BeanUtils
、Apache Commons Lang
和 Spring 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