jdk源码是c语言吗,原型模式在JDK源码中的应用

本节来讲原型模式在 JDK 源码中的应用。首先查看 JDK 中的 Cloneable 接口。

public interface Cloneable {

}

我们只需要在源码中看哪些类实现了 Cloneable 接口即可。下面是 ArrayList 类的实现代码。

public Object clone() {

try {

@SuppressWarnings("unchecked")

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 Cloneable

throw new InternalError();

}

}

从以上代码可以看出,clone() 方法只是将 List 中的元素循环遍历了一遍。此时,再思考一下,是不是这种形式就是深克隆呢?

下面用代码验证一下,继续修改 ConcretePrototype 类,增加一个 deepCloneHobbies() 方法,代码如下:

public class ConcretePrototype implements Cloneable,Serializable {

public ConcretePrototype deepCloneHobbies(){

try {

ConcretePrototype result = (ConcretePrototype) super.clone();

result.hobbies = (List) ((ArrayList) result.hobbies).clone();

return result;

}catch (CloneNotSupportedException){

return null;

}

}

...

}

客户端代码修改如下:

public static void main(String[] args) {

...

//复制原型对象

ConcretePrototype cloneType = prototype.deepCloneHobbies();

...

}

运行结果如下:

原型对象:ConcretePrototype{age=18,name='C语言中文网',hobbies=[书法, 美术]}

克隆对象:ConcretePrototype{age=18,name='C语言中文网',hobbies=[书法, 美术, 技术控]}

可以发现以上结果与《使用序列化实现深克隆》一节运行结果相同,说明以上形式是深克隆。但是这样的代码是硬编码。如果在对象中声明了各种集合类型,则每种情况都需要单独处理。因此,深克隆的写法一般会直接用序列化来操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值