• 使用Hutool完成浅克隆和深克隆 Qi


      1 import java.io.Serializable;
      2 import java.util.ArrayList;
      3 import java.util.List;
      4 
      5 import cn.hutool.core.clone.CloneRuntimeException;
      6 import cn.hutool.core.clone.Cloneable;
      7 import cn.hutool.core.util.ObjectUtil;
      8 
      9 abstract class Pet implements Serializable {
     10     private static final long serialVersionUID = 6949926634898983095L;
     11     protected String name;
     12     
     13     public Pet() {
     14         super();
     15     }
     16     public Pet(String name) {
     17         super();
     18         this.name = name;
     19     }
     20     @Override
     21     public int hashCode() {
     22         final int prime = 31;
     23         int result = 1;
     24         result = prime * result + ((name == null) ? 0 : name.hashCode());
     25         return result;
     26     }
     27     @Override
     28     public boolean equals(Object obj) {
     29         if (this == obj)
     30             return true;
     31         if (obj == null)
     32             return false;
     33         if (getClass() != obj.getClass())
     34             return false;
     35         Pet other = (Pet) obj;
     36         if (name == null) {
     37             if (other.name != null)
     38                 return false;
     39         } else if (!name.equals(other.name))
     40             return false;
     41         return true;
     42     }
     43 }
     44 
     45 class Dog extends Pet {
     46     private static final long serialVersionUID = 5872302442689438099L;
     47     
     48     public Dog() {
     49         super();
     50     }
     51     public Dog(String name) {
     52         super(name);
     53     }
     54     public void bark () {
     55         System.out.print(name + "犬吠");
     56     }
     57     @Override
     58     public String toString() {
     59         return "Dog [name=" + name + "]";
     60     }
     61 }
     62 
     63 class Student implements Cloneable<Student>, Serializable{
     64     private static final long serialVersionUID = -7925019110753655045L;
     65     
     66     private String name;
     67     private int age;
     68     private List<Pet> pets;
     69     public Student() {
     70         super();
     71     }
     72     public String getName() {
     73         return name;
     74     }
     75     public void setName(String name) {
     76         this.name = name;
     77     }
     78     public int getAge() {
     79         return age;
     80     }
     81     public void setAge(int age) {
     82         this.age = age;
     83     }
     84     public List<Pet> getPets() {
     85         return pets;
     86     }
     87     public void setPets(List<Pet> pets) {
     88         this.pets = pets;
     89     }
     90     @Override
     91     public String toString() {
     92         return "Student [name=" + name + ", age=" + age + ", pets=" + pets
     93                 + "]";
     94     }
     95     @Override
     96     public Student clone() {
     97         try {
     98             Student student =  (Student)super.clone();
     99             return student;
    100         } catch (CloneNotSupportedException e) {
    101             throw new CloneRuntimeException(e);
    102         }
    103     }
    104     @Override
    105     public int hashCode() {
    106         final int prime = 31;
    107         int result = 1;
    108         result = prime * result + age;
    109         result = prime * result + ((name == null) ? 0 : name.hashCode());
    110         result = prime * result + ((pets == null) ? 0 : pets.hashCode());
    111         return result;
    112     }
    113     @Override
    114     public boolean equals(Object obj) {
    115         if (this == obj)
    116             return true;
    117         if (obj == null)
    118             return false;
    119         if (getClass() != obj.getClass())
    120             return false;
    121         Student other = (Student) obj;
    122         if (age != other.age)
    123             return false;
    124         if (name == null) {
    125             if (other.name != null)
    126                 return false;
    127         } else if (!name.equals(other.name))
    128             return false;
    129         if (pets == null) {
    130             if (other.pets != null)
    131                 return false;
    132         } else if (!pets.equals(other.pets))
    133             return false;
    134         return true;
    135     }
    136 }
    137 
    138 public class CloneTest {
    139     public static void main(String[] args) {
    140         List<Pet> pets = new ArrayList<>();
    141         pets.add(new Dog("柯基"));
    142         
    143         Student s1 = new Student();
    144         s1.setName("小明");
    145         s1.setAge(12);
    146         s1.setPets(pets);
    147         
    148         Student s2 = s1.clone(); // 浅克隆
    149         Student s3 = ObjectUtil.cloneByStream(s1); // 深克隆,注意:执行深克隆时,该类以及该类的成员变量所属的类都需要实现Serializable接口
    150         Student s4 = ObjectUtil.clone(s1); // 当克隆的对象所属的类实现了Cloneable接口后,执行浅克隆,否则执行深克隆
    151 //        System.out.println(s1 == s2);
    152 //        System.out.println(s1.equals(s2));
    153 //        System.out.println(s1 == s3);
    154 //        System.out.println(s1.equals(s3));
    155 //        System.out.println(s1 == s4);
    156 //        System.out.println(s1.equals(s4));
    157 
    158         System.out.println(s1.getPets() == s4.getPets()); // true
    159         System.out.println(s1.getPets() == s3.getPets()); // false
    160         System.out.println(s1.equals(s3)); // true
    161 //        System.out.println(s2);
    162         System.out.println(s3);
    163 //        System.out.println(s4);
    164     }
    165 }
  • 相关阅读:
    [React] {svg, css module, sass} support in Create React App 2.0
    [NPM] npm check to update the dependencies
    [RxJS] `add` Inner Subscriptions to Outer Subscribers to `unsubscribe` in RxJS
    [RxJS] Implement RxJS `concatMap` by Waiting for Inner Subscriptions to Complete
    [React] PureComponent in React
    [RxJS] Implement RxJS `switchMap` by Canceling Inner Subscriptions as Values are Passed Through
    [RxJS] Implement RxJS `mergeMap` through inner Observables to Subscribe and Pass Values Through
    [RxJS] Chain RxJS Operators Together with a Custom `pipe` Function using Array.reduce
    [RxJS] Implement the `map` Operator from Scratch in RxJS
    [RxJS] Create a Reusable Operator from Scratch in RxJS
  • 原文地址:https://www.cnblogs.com/GjqDream/p/15791825.html
Copyright © 2020-2023  润新知