package com.xiaoleilu.hutool.core.clone; import org.junit.Assert; import org.junit.Test; import com.xiaoleilu.hutool.clone.CloneRuntimeException; import com.xiaoleilu.hutool.clone.CloneSupport; import com.xiaoleilu.hutool.clone.Cloneable; /** * 克隆单元测试 * @author Looly * */ public class CloneTest { @Test public void cloneTest(){ //实现Cloneable接口 Cat cat = new Cat(); Cat cat2 = cat.clone(); Assert.assertEquals(cat, cat2); //继承CloneSupport类 Dog dog = new Dog(); Dog dog2 = dog.clone(); Assert.assertEquals(dog, dog2); } //------------------------------------------------------------------------------- private Class for test /** * 猫猫类,使用实现Cloneable方式 * @author Looly * */ private static class Cat implements Cloneable<Cat>{ private String name = "miaomiao"; private int age = 2; @Override public Cat clone() { try { return (Cat) super.clone(); } catch (CloneNotSupportedException e) { throw new CloneRuntimeException(e); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Cat other = (Cat) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } /** * 狗狗类,用于继承CloneSupport类 * @author Looly * */ private static class Dog extends CloneSupport<Dog>{ private String name = "wangwang"; private int age = 3; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Dog other = (Dog) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } }