我们看一下Object这个对象,我们直接看一下克隆这个方法protected native Object clone() throws CloneNotSupportedException;很明显看出来,他是一个native的方法,接下来我们再看一个,Cloneable这个接口,public interface Cloneable,只要看看哪些类实现这个接口呢,就知道了这个原型模式,是如何使用的,我们按一下Ctrl+T,这里面有一个定位,直接点一下,会在下边显示出来,这里面开始搜索,在搜索的时候呢,我们再看一个类,ArrayList,相信这个类大家都是知道的,public class ArrayList extends AbstractListimplements List, RandomAccess, Cloneable, java.io.Serializable他实现了Cloneable这个接口,我们看一下它是如何重写的呢,public Object clone() {try {ArrayList> v = (ArrayList>) super.clone();v.elementData = Arrays.copyOf(elementData, size);v.modCount = 0;return v;} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError(e);}
}通过Arrays.copyOf这个方法把这里面的元素,copy了一份,同理HashMap这里面public class HashMap extends AbstractMapimplements Map, Cloneable, Serializable是一样的,他也实现了Cloneable这个接口,同时他也重写了克隆这个方法@SuppressWarnings("unchecked")
@Override
public Object clone() {HashMap result;try {result = (HashMap)super.clone();} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError(e);}result.reinitialize();result.putMapEntries(this, false);return result;
}// These methods are also used when serializing HashSets
final float loadFactor() { return loadFactor; }
final int capacity() {return (table != null) ? table.length :(threshold > 0) ? threshold :DEFAULT_INITIAL_CAPACITY;
}有兴趣的可以来看一下,那在这里想说一下,就是对于原型模式,我们平时在使用的时候,一定要检对象是否和预期是一致的,也就是说这个对象,是新创建出来的呢,还是只是创建一个引用,指向的是同一个地址,也就是说要把深克隆和浅克隆一定要应用好,我们看一下下面搜索出来的都是实现了Cloneable这个接口的实现类,这里又很多,这个是JDK的
包括redission,还有redis的client,还有Spring里面的mybatis,这里面都是实现了Cloneable接口,我们看一下Cache,CacheKey,这个类也实现了Cloneable,public class CacheKey implements CloneableCacheKey是Mybatis里面关于Cache使用的一个类,我们看一下它是如何重写的@Overridepublic CacheKey clone() throws CloneNotSupportedException {CacheKey clonedCacheKey = (CacheKey) super.clone();clonedCacheKey.updateList = new ArrayList