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

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