Задача: Глубокое полное клонирование
Исходник: Глубокое полное клонирование, язык: java [code #197, hits: 7260]
автор: - [добавлен: 02.05.2007]
  1. /*
  2. Correct Output:
  3. Original (orginal values): Person-A - Civic
  4. Clone (before change): Person-A - Civic
  5. Clone (after change): Person-B - Accord
  6. Original (after clone is modified): Person-A - Civic
  7.  
  8. */
  9.  
  10. /*
  11. Software Architecture Design Patterns in Java
  12. by Partha Kuchana
  13.  
  14. Auerbach Publications
  15.  
  16. */
  17.  
  18.  
  19.  
  20. class Person implements Cloneable {
  21. //Lower-level object
  22. private Car car;
  23.  
  24. private String name;
  25.  
  26. public Car getCar() {
  27. return car;
  28. }
  29.  
  30. public String getName() {
  31. return name;
  32. }
  33.  
  34. public void setName(String s) {
  35. name = s;
  36. }
  37.  
  38. public Person(String s, String t) {
  39. name = s;
  40. car = new Car(t);
  41. }
  42.  
  43. public Object clone() {
  44. //Deep copy
  45. Person p = new Person(name, car.getName());
  46. return p;
  47. }
  48. }
  49.  
  50. class Car {
  51.  
  52. private String name;
  53.  
  54. public String getName() {
  55. return name;
  56. }
  57.  
  58. public void setName(String s) {
  59. name = s;
  60. }
  61.  
  62. public Car(String s) {
  63. name = s;
  64. }
  65. }
  66.  
  67. public class DeepCopyTest {
  68.  
  69. public static void main(String[] args) {
  70. //Original Object
  71. Person p = new Person("Person-A", "Civic");
  72. System.out.println("Original (orginal values): " + p.getName() + " - "
  73. + p.getCar().getName());
  74.  
  75. //Clone as a shallow copy
  76. Person q = (Person) p.clone();
  77.  
  78. System.out.println("Clone (before change): " + q.getName() + " - "
  79. + q.getCar().getName());
  80.  
  81. //change the primitive member
  82. q.setName("Person-B");
  83.  
  84. //change the lower-level object
  85. q.getCar().setName("Accord");
  86.  
  87. System.out.println("Clone (after change): " + q.getName() + " - "
  88. + q.getCar().getName());
  89.  
  90. System.out.println("Original (after clone is modified): " + p.getName()
  91. + " - " + p.getCar().getName());
  92.  
  93. }
  94. }
Тестировалось на: java 1.5.0_04

+добавить реализацию