这一条告诉我们,clone接口在定义时就没有指明一个类在实现时应该承担哪些责任,所以我想这个接口如果不是当初设计不良,就是后来的实现与当初设计偏离的。
clone方法设想提供一种不需要构造器就可以创建对象的方法。它方法要求x.clone()!=x, 且x.clone().getClass()==x.getClass(),且通x.clone().equals(x), 这些规定很弱。比如x.clone().getClass()通常要等于被克隆的对象。这样,如果子类clone方法调用父类的clone,往往最终返回一个子类。
虽然列举了很多clone对象的方法。但是最终坐着还是建议不要使用clone方法。
如果真的要copy对象,可以使用拷贝构造器(copy constructor)或拷贝工厂(copy factory)。比起调用clone方法,这样做风险更小。
因为clone接口存在很多问题,所以很多专家从来不去调用它。
1. clone方法简介
关于clone方法的简介可以看点击打开链接。
简单总结一下,在java中我们想得到一个和之前用过的对象一模一样的新对象,简单的使用=
符号复制是不行的,我们需要用到clone方法,这就是clone方法的用处。因为clone方法是protected
类型的,所以不能在外部直接使用,下面一段代码简单说明一下clone方法的使用:
public class CloneObject implements Cloneable {
public String field01;
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
throw new AssertionError();
}
}
}
首相我们需要是想Cloneable接口,然后再重载一个public类型的clone方法,然后在里面返回super.clone()就行了。
2. 使用拷贝构造器或者拷贝工厂方法来代替覆盖Clone方法
拷贝构造器例子:
public class MyObject {
public String field01;
public MyObject() {
}
public MyObject(MyObject object) {
this.field01 = object.field01;
}
}
拷贝静态工厂:
public class MyObject {
public String field01;
public MyObject() {
}
public static MyObject newInstance(MyObject object) {
MyObject myObject = new MyObject();
myObject.field01 = object.field01;
return myObject;
}
}
作者:想飞的僵尸
链接:http://www.jianshu.com/p/40d8319ca937