阿里巴巴Java开发手册重点解读(二)深拷贝

来源:互联网 发布:阿里云服务器欠费 编辑:程序博客网 时间:2024/05/20 22:37

编程规约-OOP规约-19

【推荐】慎用 Object 的 clone 方法来拷贝对象。
说明: 对象的 clone 方法默认是浅拷贝,若想实现深拷贝需要重写 clone 方法实现属性对象
的拷贝。

什么是浅拷贝?
对象下级如果有对象数组如域成员f1=new Object[10],拷贝出来的对象的域成员f1还是指针引用至源对象的成员f1指向的那个对象,也就是说域成员如果是对象的话,只拷贝引用,不拷贝对象本身。
什么是深拷贝?
当前对象及其关联对象,全部都是新对象

深拷贝的实现方案

反射模式:
org.apache.commons.beanutils.PropertyUtils.copyProperties(Object dest, Object orig)
org.apache.commons.beanutils.BeanUtils.copyProperties(Object dest, Object orig)
字节码代理模式:(效率更高)
使用net.sf.cglib.beans.BeanCopier.copy(Object paramObject1, Object paramObject2, Converter paramConverter),这个工具类可以实现同类型拷贝,也可以实现不同类型的拷贝,添加转换器还可以实现不同属性的拷贝。

不过copier创建的代价较高,应该缓存起来,在已用过的类型上不反复创建copier。

还可以用org.dozer.DozerBeanMapper

可以看看这几篇博文:
对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀
BeanCopier系列之一:特性测试
Dozer扫盲级教程
Dozer开发手册
关于BeanCopier的一些思考 - ImportNew

高能预警

bean的拷贝或者映射是很常见的,如requestMap转命令对象,resultSet转java bean,显然无需重复造轮子。

但一定要考虑性能问题,选择一个工具包,要熟读其官方的建议,如BeanCopier应缓存,BeanMapper应单例等。

还有,如果对象结构是异构的,要自己做些细节的调整,写/注册一些Converter。

原创粉丝点击