テスト
以下のコードに示すように、異なるディープコピーの方法をテストすることができます。
public static void main(String[] args) {
GPA gpa = new GPA(7, 8);
Student original = new Student("John", gpa);
// シャローコピー
Student shallowCopy = null;
try {
shallowCopy = (Student)original.clone();
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
// clone()を使用したディープコピー
Student cloneCopy = null;
try {
cloneCopy = (Student)original.clone();
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
// コピーコンストラクタを使用したディープコピー
Student constructorCopy = new Student(original);
// 直列化を使用したディープコピー
Student serializationCopy = original.deepCopyUsingSerialization();
// ディープコピーのテスト
System.out.println("元のオブジェクト: \t\t" + original.getGpa().getFirstYear() + " " + original.getGpa().getSecondYear());
System.out.println("シャローコピー: \t\t\t" + shallowCopy.getGpa().getFirstYear() + " " + shallowCopy.getGpa().getSecondYear());
System.out.println("クローンコピー: \t\t\t" + cloneCopy.getGpa().getFirstYear() + " " + cloneCopy.getGpa().getSecondYear());
System.out.println("コピーコンストラクタコピー: \t" + constructorCopy.getGpa().getFirstYear() + " " + constructorCopy.getGpa().getSecondYear());
System.out.println("直列化コピー: \t\t" + serializationCopy.getGpa().getFirstYear() + " " + serializationCopy.getGpa().getSecondYear());
cloneCopy.setGpa(new GPA(10, 9));
System.out.println("\ncloneCopyのGPAフィールドを変更した後: ");
System.out.println("元のオブジェクト: \t\t" + original.getGpa().getFirstYear() + " " + original.getGpa().getSecondYear());
System.out.println("クローンコピー: \t\t\t" + cloneCopy.getGpa().getFirstYear() + " " + cloneCopy.getGpa().getSecondYear());
}