Advertisement
VirKato

Cloneable

Jan 15th, 2023 (edited)
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.71 KB | Source Code | 0 0
  1. public class CloneExample {
  2.     public static void main(String[] args) {
  3.         Cat cat = new Cat("Вася", 2);
  4.         Cat cat1 = new Cat("Мурка", 2);
  5.  
  6.         cat1.setPair(cat.clone()); // Мурка в паре с Васей
  7.         cat.setPair(cat1); // Вася в паре с Муркой
  8.  
  9.         Cat cat2 = cat.clone(); // копия Васи
  10.  
  11.         cat.incAge(); // оригинал Васи постарел
  12.         cat/*.getPair()*/.clear(); // оригинал Васи одинок
  13.  
  14.         System.out.println(cat); // оригинал Васи
  15.         System.out.println(cat2); // копия Васи
  16.     }
  17. }
  18.  
  19.  
  20. class Cat implements Cloneable {
  21.     private final String name; // неизменяемый
  22.     private Integer age; // неизменяемый
  23.     private Cat pair; // изменяемый
  24.  
  25.     public Cat(String name, Integer age) {
  26.         this.name = name;
  27.         this.age = age;
  28.     }
  29.  
  30.     public void incAge() {
  31.         age++;
  32.     }
  33.  
  34.     public void setPair(Cat cat) {
  35.         pair = cat;
  36.     }
  37.  
  38.     public void clear() {
  39.         pair = null;
  40.     }
  41.  
  42.     @Override
  43.     public Cat clone() {
  44.         try {
  45.             Cat clone = (Cat) super.clone();
  46.             // TODO: copy mutable state here, so the clone can't change the internals of the original
  47.             if (pair != null) clone.pair = pair.clone();
  48.             return clone;
  49.         } catch (CloneNotSupportedException e) {
  50.             throw new AssertionError();
  51.         }
  52.     }
  53.  
  54.     @Override
  55.     public String toString() {
  56.         return "Cat{" +
  57.                 "name='" + name + '\'' +
  58.                 ", age=" + age +
  59.                 ", pair=" + pair +
  60.                 '}';
  61.     }
  62. }
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement