java原生浅克隆
@Data
public class Cat1 implements Cloneable {
private String color;
private String name;
private Dog1 dog;
@Override
public Object clone() throws CloneNotSupportedException {
Cat1 cat = (Cat1) super.clone();
return cat;
}
}
@Data
public class Dog1{
private String color;
private String name;
public Dog1(String color, String name) {
this.color = color;
this.name = name;
}
}
java原生深克隆
@Data
public class Cat implements Cloneable {
private String color;
private String name;
private Dog dog;
@Override
public Object clone() throws CloneNotSupportedException {
Cat cat = (Cat) super.clone();
cat.dog= (Dog) dog.clone();
return cat;
}
}
@Data
public class Dog implements Cloneable{
private String color;
private String name;
public Dog(String color, String name) {
this.color = color;
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
hutool深克隆
@Data
public class Bird implements Serializable{
private String color;
private String name;
private Bird3 bird3;
public Bird(String color, String name) {
this.color = color;
this.name = name;
}
}
@Data
public class Bird3 implements Serializable{
private String color;
private String name;
public Bird3(String color, String name) {
this.color = color;
this.name = name;
}
}
测试
//浅克隆
Cat1 cat1 = new Cat1();
cat1.setColor("白色");
cat1.setName("小白");
cat1.setDog(new Dog1("白","狗"));
Cat1 cat2 = (Cat1) cat1.clone();
cat2.setColor("蓝色");
cat2.setName("小蓝");
cat2.getDog().setName("天空");
System.out.println(cat1);
System.out.println(cat2);
//深克隆
Cat cat3 = new Cat();
cat3.setColor("白色");
cat3.setName("小白");
cat3.setDog(new Dog("白","狗"));
Cat cat4 = (Cat) cat3.clone();
cat4.setColor("蓝色");
cat4.setName("小蓝");
cat4.getDog().setName("天空");
System.out.println(cat3);
System.out.println(cat4);
//hutool流克隆
Bird bird1 = new Bird("黄色", "鹦鹉");
bird1.setBird3(new Bird3("小黄","鹦鹉儿子"));
Bird bird2 = ObjectUtil.cloneByStream(bird1);
bird2.getBird3().setName("鹦鹉儿子copy");
测试结果
Cat1(color=白色, name=小白, dog=Dog1(color=白, name=天空)) Cat1(color=蓝色, name=小蓝, dog=Dog1(color=白, name=天空)) Cat(color=白色, name=小白, dog=Dog(color=白, name=狗)) Cat(color=蓝色, name=小蓝, dog=Dog(color=白, name=天空)) Bird(color=黄色, name=鹦鹉, bird3=Bird3(color=小黄, name=鹦鹉儿子)) Bird(color=黄色, name=鹦鹉, bird3=Bird3(color=小黄, name=鹦鹉儿子copy))
总结
1.原型模式是一种对象模型快速复制的技术。
2.浅克隆仅仅复制所考虑的对象,不会复制它所引用的成员对象(地址复用)。
3.java原生深拷贝,需要引用的成员变量实现Cloneable接口与clone方法。克隆类需要克隆本身及其成员变量。
@Override
public Object clone() throws CloneNotSupportedException {
Cat cat = (Cat) super.clone();
cat.dog= (Dog) dog.clone();
return cat;
}
4.序列化技术实现深克隆:序列化(Serialization)就是将对象写到流的过程,写到流中的对象是原有的对象的一个拷贝,而原对象仍存在内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且也可以复制其引用的成员对象,因此通过序列化将对象写入一个流中,再从流中将其读出来,从而实现深克隆
案例:(obj及其引用的成员变量实现Serializable)
ObjectUtil.cloneByStream(obj)



