`
风花雪月饼
  • 浏览: 75975 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

深度克隆的简单实现

    博客分类:
  • Java
阅读更多
最近很忙,上次发的博客还没编辑。
换的新工作,每天加班。也没用什么高深技术。不过这样倒好。就操作纯JAVA,没那么多框架什么的。省了很多心。

最近做的一些业务中有需要用到序列化存储等一系列的技术。现在不忙了。回头想想。发现深度克隆可以如此简单。
不过。需要克隆的类必须都实现Serializable。这点我也没办法。因为追求的是简单实现嘛。

废话不多说了。

首先,我们要建立两个类,Group和User
/**
 * 用户分组
 * @author wilber
 * */
public class Group implements Cloneable,Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -8758194056672315373L;
	private String name;
	private List<User> users = new ArrayList<User>();
	
	public Group clone(){
		return (Group)CloneHelper.clone(this);
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List<User> getUsers() {
		return users;
	}
	public void setUsers(List<User> users) {
		this.users = users;
	}
}


/**
 * 用户
 * @author wilber
 * */
public class User implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1849599401392558181L;
	private String name;
	private String password;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}


小童鞋,不要急,不要问我CloneHelper是哪来的。。。


下面的代码很丑。。。我实在是太懒了。。。对于DEMO。。。还是。。。凑合凑合吧。。
/**
 * 克隆辅助类
 * @author wilber
 * */
public class CloneHelper {
	/**
	 * 克隆一个指定的对象实例,该对象及其引用对象需要实现Serializable
	 * @param Object
	 * @return Object
	 * */
	public static Object clone(Object object){
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		try {
			ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(byteOut);
			oos.writeObject(object);
			ois = new ObjectInputStream(new ByteArrayInputStream(byteOut.toByteArray()));
			return ois.readObject();
		} catch (IOException e) {
			throw new RuntimeException("Clone Object failed in IO.",e);
		} catch (ClassNotFoundException e) {
			throw new RuntimeException("Class not found.",e);
		}finally{
			try{
				if(oos != null) oos.close();
				if(ois != null) ois.close();
			}catch(IOException e){
				//Do Nothing
			}
		}
	}
}


好了。我们要建立测试。

public class TestCloneMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Group group = createGroupInstance();
		Group cloneGroup = group.clone();
		System.out.println(cloneGroup == group);
		group.setName("GroupI");
		System.out.println(cloneGroup.getName());
	}

	private static Group createGroupInstance(){
		Group group = new Group();
		group.setName("group");
		User user1 = new User();
		user1.setName("wilber");
		user1.setPassword("123456");
		User user2 = new User();
		user2.setName("daisy");
		user2.setPassword("654321");
		group.getUsers().add(user1);
		group.getUsers().add(user2);
		return group;
	}
}


什么?没用测试框架?
呃。。。好吧。。。我不够敏捷。。。不是TDD。。。
因为我一开始就想好怎么写了。。。

以上代码还需要更多测试。我就稍微测试了一下。发现是可行的。

总结:
使用ObjectOutputStream和ObjectInputStream来进行深度克隆。非常简单。仅需要一点点代码。
分享到:
评论
3 楼 junJZ_2008 2010-05-06  
public Group clone(){  
        return (Group)CloneHelper.clone(this);  
}  

jdk1.5以前版本是不能编译的。标准的是public Object clone(){  
2 楼 taro 2009-09-18  
可以用反射机制实现通用深度克隆,不用考虑有多深,多少对象属性
1 楼 全冠清 2009-07-03  
mark一下

相关推荐

    java深度克隆

    2. **手工编写方式**:对于复杂对象或者包含大量循环引用的对象,可以通过重写对象中的`clone()`方法并手动处理其中的引用类型成员变量来实现深度克隆。这种方式更加灵活,但编写起来相对复杂且容易出错。 #### 三...

    clone 深度克隆对象

    这意味着如果一个对象中包含了其他对象的引用,深度克隆会创建这些引用对象的独立副本,而不是简单地复制引用。因此,即使原始对象被修改,深克隆后的副本也不会受到影响,从而提供了数据安全性。 在Java中,实现...

    深度克隆的事例代码

    在Java、JavaScript、Python等编程语言中,都有实现深度克隆的方法。下面我们将分别探讨这些语言中的深度克隆技术。 ### Java中的深度克隆 在Java中,我们可以利用序列化和反序列化来实现深度克隆。首先,我们需要...

    一行代码实现纯数据json对象的深度克隆实现思路

    在JavaScript中,深度克隆指的是创建一个新对象,其内容完全复制自源对象,包括所有嵌套的对象和数组。...总的来说,这是一种简单易用但有一定局限性的深度克隆方法,适用于大多数简单的数据结构克隆需求。

    JavaScript浅层克隆与深度克隆示例详解

    此外,还可以利用JSON序列化和反序列化实现深度克隆,但这种方法有一些限制,例如不能处理函数和循环引用。 ```javascript function deepClone(origin, target, hash = new WeakMap()) { if (origin === null) ...

    dotnet-此项目为Natasha的衍生项目为用户提供高性能的深度克隆

    只需简单调用提供的API,即可完成对象的深度克隆,这对于需要大量复制复杂对象的系统来说,无疑大大提升了性能。 项目文件“DeepClone-master”很可能包含了源代码、示例、文档和其他资源,供开发者学习和使用。...

    beancopy:java bean深度克隆的简单实现

    beancopy ###java bean深度克隆的简单实现 Bean中必须有对应的getter, setter方法. 可以复制包含 "8种基本类型, String, java.util.Date, enum, Set, List 以及多层嵌套" 的Bean.

    深入JAVA对象深度克隆的详解

    要实现深度克隆,首先,你的类需要实现`java.io.Serializable`接口,这是Java中用于序列化的标记接口。然后,你可以定义一个名为`copy()`的方法来执行深度克隆,如下所示: ```java public class YourClass ...

    一个用于对象深度克隆的同构和可配置javascript函数

    在JavaScript中,简单的赋值操作或`Object.assign()`方法只能实现浅拷贝,即只复制对象的最外层属性,而深层嵌套的对象或数组引用不会被复制,它们在原始对象和副本之间共享。相比之下,深度克隆会递归地复制所有...

    nanoclone只有145B实现深度克隆JavaScript对象

    标题提到的"nanoclone"是一个极简的JavaScript库,其核心代码只有145字节,但能实现深度克隆功能。这在追求轻量级解决方案的场景下显得尤为宝贵。 在JavaScript中,有多种实现深拷贝的方法。例如,可以使用JSON的...

    JS对象深度克隆实例分析

    在JavaScript中,有多种实现深度克隆的方法,包括使用JSON对象的`stringify`和`parse`方法,以及递归复制对象的属性。 在上面的实例中,作者提供了一个名为`cloneObj`的函数来实现深度克隆。这个函数首先检查传入的...

    JS对象的深度克隆方法示例

    在描述的示例中,提供了两种实现JavaScript深度克隆的方法。 ### 方法1:递归遍历复制 这种方法通过遍历对象的每个属性,如果属性是对象类型,就递归调用自身进行克隆。以下是具体的实现: ```javascript ...

    解析JAVA深度克隆与浅度克隆的区别详解

    在Java编程语言中,克隆是...总之,浅度克隆适用于对象不包含或只需要复制引用的简单情况,而深度克隆适用于需要复制对象及其所有引用的对象的情况。根据实际需求选择合适的克隆方式对优化代码性能和正确性至关重要。

    浅析Java中clone()方法浅克隆与深度克隆

    总之,Java的克隆机制提供了一种创建对象副本的方式,浅克隆适用于简单的数据结构,而深度克隆适用于复杂的数据结构,以避免对象间的引用共享导致的意外修改。正确理解和使用克隆机制,可以帮助开发者更好地控制对象...

    javascript浅层克隆、深度克隆对比及实例解析

    下面是一个简单的深度克隆实现: ```javascript function deepClone(origin, target) { var target = target || {}, toStr = Object.prototype.toString, arrStr = '[object Array]'; for (var prop in origin)...

    js代码-javascript深度克隆

    在JavaScript中,有多种实现深度克隆的方法: 1. JSON.parse 和 JSON.stringify 这是一个简单但有限的方法。它可以克隆基本类型的数据以及没有循环引用和函数的简单对象。例如: ```javascript let obj = {a: 1, b:...

Global site tag (gtag.js) - Google Analytics