EffectiveJava-第11条 谨慎地覆盖克隆clone

1、clone方法的通用约定是非常弱的
x.clone()!=x
x.clone().getClass()==x.getClass()
x.clone().equals(x)
都不是绝对的要求

2、Clone方法就是另一个构造器,你必须保证它不会伤害到原始的对象,并确保正确地创建被克隆对象中的约束条件。

3、clone架构与应用可变对象的final域的正常用法是不兼容的。

4、深度clone,典型例子HashTable

5、线程安全的类实现Cloneable接口,clone方法必须实现好同步:HashTable。
public class DeepClone {
public static void main(String[] arr){
Hashtable<String, Integer> table=new Hashtable<String, Integer>();
table.put("MM", 100);

Hashtable<String, Integer> copytable=(Hashtable) table.clone();
System.out.println("----------mm----------"+copytable.get("MM"));


}
}


总结:

(1)默认实现方式
实现了Cloneable接口的类都应该有一个公用的方法覆盖clone:

@Override public PhoneNumber clone() {
super.clone();
}
此公有方法首先调用super.clone(),然后修正任何需要修正的域(浅克隆、深度克隆)。
(2)最佳实践
实现对象的拷贝的好办法是提供一个拷贝构造器(copy constructor)或者拷贝工厂(copy factory)
相比Cloneable/clone优点:
不依赖于某一种很有风险的,语言之外的对象创建机制;
不要求遵守尚未制定好的文档规范;
不会与final域的正常使用发生冲突;
不会抛出不必要的受检查异常CloneNotSupportedException;
不需要强制进行类型转换;
建议使用最佳实践

/**
* 拷贝构造器(copy constructor)或者拷贝工厂(copy factory)展示
* @author Administrator liuyang
* Dec 23, 2009-12:05:00 AM
*/
public class GoodClone {
private int type;
private final String special;

public GoodClone(int type, String spe) {
this.type = type;
this.special = spe;
}
/**
* 拷贝构造器
* @param good
*/
public GoodClone(GoodClone good) {
this.special = good.special;
this.type = good.type;
}
/**
* 拷贝工厂
* @param good
* @return
*/
public static GoodClone newInstance(GoodClone good) {
return new GoodClone(good.type, good.special);
}

public static GoodClone cloneInstance(GoodClone good) {
return new GoodClone(good.type, good.special);
}

public static void main(String[] arr) {
GoodClone entity = new GoodClone(10, "spacialGood");
GoodClone copyEd1 = GoodClone.newInstance(entity);
System.out.println("----------克隆方式newInstance-----------"
+ (entity == copyEd1));

GoodClone copyEd2 = new GoodClone(entity);
System.out.println("----------克隆方式2-----------" + (entity == copyEd2));

System.out.println("----------克隆方式1与克隆方式2-----------"
+ (copyEd1 == copyEd2));
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值