== 这是 中国WEB信息博物馆Web InfoMall 2004年05月04日 存储的网页 ==
点击这里查看本网页的其他版本 隐藏InfoMall信息

竹笋炒肉: 读《Effective java 中文版》(11)

February 10, 2004

读《Effective java 中文版》(11)

第10条:谨慎地改写clone

  Cloneable接口的目的是作为对象的一个mixin接口,表明这样的对象允许克隆。Cloneable没有包含任何方法,只是决定了Object中受保护的clone方法实现的行为:如果一个类实现了Cloneable,则Object的clone方法返回该对象的逐域拷贝,否则抛出一个CloneNotSupportedException异常。
  至于clone本身,是一种很有风险的、语言之外的对象创建机制:无须调用构造函数就可以创建一个函数。
  clone方法的约定是:创建和返回对象一个拷贝,且

  • x.clone!=x为true,
  • x.clone().getClass()==x.getClass()为true,
  • x.clone.equals(x)为true,
当然,这三个也不是绝对的要求。
  如果你改写了一个非final类的clone方法,则应该返回一个通过调用super.clone而得到的对象。如果一个类的所有超类都遵守这条规则,那么一直调用super.clone最终会调用到object的clone方法,从而创建出正确的类的实例。这种机制大致上类似于自动的构造函数链,只不过它不是强制要求的。
  实际上,clone方法是另一个构造函数,你必须确保它不会伤害到原始的对象,并且正确地建立起被克隆对象中的约束关系。
  Clone结构与指向可变对象的final域的正常用法是不兼容的。非除非在原始对象和克隆对象之间可以安全地共享此可变对象。为了使一个类成为可克隆的,可能有必要从某些域中去掉final修饰符。
  实现对象拷贝的好办法,是提供一个拷贝构造函数(其唯一的参数的类型是包含该构造函数的类)。
  Cloneable有如此多问题,其它的接口不应该扩展该接口,为了继承而设计的类(参见第15条)也就该实现这个接口。

Posted by Hilton at February 10, 2004 06:29 PM | TrackBack
Comments

sdf

Posted by: sdf at March 21, 2004 08:56 PM
Post a comment









Remember personal info?