构建原型后,自身复制完成对象的创建,如果普通的方式通过new大量创建对象是很慢的,这里通过clone()是非常快的相对new来说
需要类实现Cloneable接口,调用自身的clone方法完成对象的复制。
package com.ufgov;
public class CloneObj implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
技术要点:
1.需要实现Cloneable接口,重写clone方法
2.super.clone() 调用Object的clone方法来完成拷贝。
深拷贝:拷贝基本数据类型和拷贝引用类型,完整拷贝。
浅拷贝:只拷贝基本数据类型,不拷贝引用类型(引用类型还是原来的指向)
实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Prototype implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String string;
private SerializableObject obj;
/* 浅复制 */
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
/* 深复制 */
public Object deepClone() throws IOException, ClassNotFoundException {
/* 写入当前对象的二进制流 */
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
/* 读出二进制流产生的新对象 */
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public SerializableObject getObj() {
return obj;
}
public void setObj(SerializableObject obj) {
this.obj = obj;
}
}
class SerializableObject implements Serializable {
private static final long serialVersionUID = 1L;
}