深度克隆的简单实现

最近很忙,上次发的博客还没编辑。
换的新工作,每天加班。也没用什么高深技术。不过这样倒好。就操作纯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来进行深度克隆。非常简单。仅需要一点点代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值