=================浅克隆======================
public class BaseA {
private String name;
private String age;
private String id;
private List<String> list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public BaseA clone(){
BaseA clone = new BaseA();
clone.setName(this.name);
clone.setAge(this.age);
clone.setId(this.id);
clone.setList(this.list);
return clone;
}
}
public class CloneTool {
public static BaseA clone(BaseA baseA){
return baseA.clone();
}
}
public class CloneTest {
public static void main(String[] args) {
//baseA
BaseA baseA = new BaseA();
baseA.setAge("age1");
baseA.setId("id1");
baseA.setName("name1");
baseA.setList(new ArrayList<String>());
baseA.getList().add("list1");
//baseB
BaseA baseB = CloneTool.clone(baseA);
baseB.getList().add("list2");
System.out.println(baseA.getList());
System.out.println(baseB.getList());
System.out.println(baseA.getList() == baseB.getList());
}
}
最终得出的结果:
[list1, list2]
[list1, list2]
true
问题:对于对象中的引用类型,并没有真实的克隆,而是只是复制的原型的地址,导致克隆对象作更改也会改变原型的值。
===============================深克隆============
将第一段代码中的clone中的方法改成deepClone方法
public BaseA deepClone() throws Exception{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
BaseA deepClone = (BaseA)ois.readObject();
return deepClone;
}
输出结果:
[list1]
[list1, list2]
false
扩展===========================
BeanUtils.copy()
JSON.parseObject()
Guava都是使用了原型模式