第十一条:谨慎地覆盖clone方法

这一条告诉我们,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值