java复制对象的几种方法

最近业务要复制对象,但我又不想一个个的去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新对象的语句写在循环外部,不然每次的新值都是一个引用地址。

    原文作者:苏淼1449
    原文地址: https://blog.csdn.net/weixin_44863376/article/details/105453562
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞