私はオブジェクトのディープ クローニングについて学習していました。シングルトンを返す getInstance メソッドを持つ従業員クラスがあり、返されたオブジェクトのクローンを作成しています。以下はクラスとテスト クラスです。
public class Employee implements Serializable , Cloneable {
public static Employee employee;
private String name;
private int age;
private Employee(){
}
public Employee(String name, int age) {
super();
this.name = name;
this.age = age;
}
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static Employee getInstance(){
if(employee == null ){
employee = new Employee();
return employee;
}
return employee;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
オブジェクトのディープ コピー テスト クラス
public class CopyTest {
/**
* @param args
*/
public static void main(String[] args) {
try {
Employee original = Employee.getInstance();
original.setName("John");
original.setAge(25);
Employee cloned = (Employee)copy(original);
System.out.println("Original -->"+Employee.getInstance().getName());
cloned.getInstance().setName("Mark");
System.out.println("Cloned -->"+cloned.getInstance().getName());
System.out.println("Original -->"+Employee.getInstance().getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Object copy(Object orig) {
Object obj = null;
try {
// Write the object out to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(orig);
out.flush();
out.close();
// Make an input stream from the byte array and read
// a copy of the object back in.
ObjectInputStream in = new ObjectInputStream(
new ByteArrayInputStream(bos.toByteArray()));
obj = in.readObject();
}
catch(IOException e) {
e.printStackTrace();
}
catch(ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
return obj;
}
}
出力
Original -->John
Cloned -->Mark
Original -->Mark
問題
元のオブジェクトをクローンしてコピーを作成しても、
Employee cloned = (Employee)copy(original);
そして、次のように呼び出して、複製されたオブジェクトのプロパティを変更します。
cloned.getInstance().setName("Mark");
コンソール出力からわかるように、元のオブジェクトに反映されています。これは静的呼び出しのためだと思いますか?、どうすればこれを克服できますか? getInstance メソッドによってオブジェクトの単一のインスタンスが必要であり、後でオブジェクトのコピーを作成することにしたという原則に違反していますか?