Javaでの深コピーを実現する2つの方法――clone()&Serialized
5011 ワード
clone()メソッドは、ステートメントインターフェースCloeableを実装し、Objectクラスのcloneメソッドをカバーし、機能領域をpublicに設定する必要があります。
プログレッシブな方法は簡単で、すべての関連するクラスの実現インターフェースSerialzableを必要とします。
プログレッシブな方法は簡単で、すべての関連するクラスの実現インターフェースSerialzableを必要とします。
package b1ch06.clone;
import java.io.Serializable;
class Car implements Cloneable, Serializable {
private String band;
public Car(String band) {
this.band = band;
}
public String getBand() {
return band;
}
public void setBand(String band) {
this.band = band;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package b1ch06.clone;
import java.io.Serializable;
class Employee implements Cloneable, Serializable {
private String name;
private Car car;
public Employee(String name, Car car) {
this.name = name;
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getcar() {
return car;
}
public void setcar(Car car) {
this.car = car;
}
protected void test() {
System.out.println("test func");
}
@Override
public Object clone() throws CloneNotSupportedException {
Employee employee_cloned = (Employee) super.clone();
Car car_cloned = (Car) this.car.clone();
employee_cloned.setcar(car_cloned);
return employee_cloned;
}
}
package b1ch06.clone;
import java.io.*;
public class SerializedClone {
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) {
T cloneObj = null;
try {
//
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(out);
obs.writeObject(obj);
obs.close();
// , ,
ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(ios);
//
cloneObj = (T) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return cloneObj;
}
}
package b1ch06.clone;
public class MyClone {
public static void main(String[] args) {
Car car = new Car("BMW");
Employee employee = new Employee("ANDY", car);
// : clone()
try {
Employee employee_cp = (Employee) employee.clone();
System.out.println("=========================");
System.out.println("original ?:");
System.out.println(employee.toString());
System.out.println("copy ?:");
System.out.println(employee_cp.toString());
System.out.println(" ?:");
System.out.println(employee_cp == employee);
System.out.println("=========================");
System.out.println("original car ?:");
System.out.println(employee.getcar().toString());
System.out.println("copy car ?:");
System.out.println(employee_cp.getcar().toString());
System.out.println(" car ?:");
System.out.println(employee_cp == employee);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// :
Employee cloned_employee = SerializedClone.clone(employee);
System.out.println("=========================");
System.out.println("original ?:");
System.out.println(employee.toString());
System.out.println("copy ?:");
System.out.println(cloned_employee.toString());
System.out.println(" ?:");
System.out.println(cloned_employee == employee);
System.out.println("=========================");
System.out.println("original car ?:");
System.out.println(employee.getcar().toString());
System.out.println("copy car ?:");
System.out.println(cloned_employee.getcar().toString());
System.out.println(" car ?:");
System.out.println(cloned_employee == employee);
}
}
以上は小编が绍介したJavaの中で深コピーを実现する2つの方法です。――clone()&Serializedの详细な统合は、皆さんの助けになりたいです。ここでも私たちのサイトを応援してくれてありがとうございます。