最近业务要复制对象,但我又不想一个个的去get、set,于是就网上找了三种复制对象的方法。
一,浅层复制。
1.需要复制的类实现Cloneable接口;
2.复写clone()方法;
import java.lang.Cloneable;;
public class OrderVO implements Cloneable {
private int orderID;
private int userID;
private double orderAmount;
public int getOrderID() {
return orderID;
}
public void setOrderID(int orderID) {
this.orderID = orderID;
}
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public double getOrderAmount() {
return orderAmount;
}
public void setOrderAmount(double orderAmount) {
this.orderAmount = orderAmount;
}
@Override
public Object clone() {
OrderVO vo = null;
try {
vo = (OrderVO) this.clone();
} catch (Exception e) {
e.printStackTrace();
}
return vo;
}
}
二,深层复制。
在浅层复制中,只是值类型的成员变量,对于引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。这样修改了复制对象的引用值,原对象的值也会改变,这当然是不对的。
解决方法有2种,一是把变量的引用类型也设置为克隆对象;二是直接实现序列化,对对象进行IO操作,读取/写入。可想而知,方法一比较麻烦。
三、工具类BeanUtils和PropertyUtils进行对象复制
无论是实现clone()方法,还是进行IO操作,都是比较麻烦的,代码也多,这时,可以利用java的工具类,一行搞定。
BeanUtils和PropertyUtils主要的区别在于,BeanUtils提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而PropertyUtils不支持这个功能。因为不支持,所以速度会更快一些。在实际开发中,BeanUtils使用更普遍一点,犯错的风险更低一点。
OrderVO vo1 = new OrderVO(); // 原对象
OrderVO vo2 = new OrderVO(); // 目标对象
try {
BeanUtils.copyProperties(vo2, vo1);
} catch (Exception e) {
e.printStackTrace();
}
注意,如果是要循环复制对象,切不可把new新对象的语句写在循环外部,不然每次的新值都是一个引用地址。