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

xiaoxiao2021-02-28  80

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

转载请注明原文地址: https://www.6miu.com/read-46632.html

最新回复(0)