首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java clone步骤使用详解(转)

2012-12-24 
Java clone方法使用详解(转)为了理解java的clone,有必要先温习以下的知识。  java的类型,java的类型分为两

Java clone方法使用详解(转)

为了理解java的clone,有必要先温习以下的知识。

  java的类型,java的类型分为两大类,一类为primitive,如int,另一类为引用类型,如String,Object等等。

  java引用类型的存储,java的引用类型都是存储在堆上的。

class User implements Cloneable {String name;int age;@Overridepublic User clone() throws CloneNotSupportedException {return (User) super.clone();}}class Account implements Cloneable {User user;long balance;@Overridepublic Account clone() throws CloneNotSupportedException {Account account = null;account = (Account) super.clone();if (user != null) {account.user = user.clone();}return account;}}

?

对clone的态度

  clone嘛,我觉得是个好东西,毕竟系统默认实现已经帮我们做了很多事情了。

  但是它也是有缺点的。

  1 手工维护clone的调用链。这个问题不大,程序员有责任做好。

  2 如果class的field是个final的可变类,就不行了。三部曲的第三步没有办法做了。

  考虑一个类对clone的态度,有如下几种。

  1 公开支持:好吧,按照clone三部曲实现吧。前提是父类支持(公开或者默默)。

  2 默默支持:不实现Cloneable接口,但是在类里面有正确的protected的clone实现,这样,该类不支持clone,但是它的子类如果想支持的话也不妨碍。

  3 不支持:好吧,为了明确该目的,提供一个抛CloneNotSupportedException 异常的protected的clone实现。

  4 看情况支持:该类内部可以保存其他类的实例,如果其他类支持则该类支持,如果其他类不支持,该类没有办法,只有不支持。

  其他的选择

  可以用原型构造函数,或者静态copy方法来手工制作一个对象的copy。

  好处是即使class的field为final,也不会影响该方法的使用。不好的地方是所有的primitive赋值都得自己维护。

  和Serializable的比较

  使用Serializable同样可以做到对象的clone。但是:

  Cloneable本身就是为clone设计的,虽然有一些缺点,但是如果它可以clone的话无疑用它来做clone比较合适。如果不行的话用原型构造函数,或者静态copy方法也可以。

  Serializable制作clone的话,添加了太多其它的东西,增加了复杂性。

  1 所有的相关的类都得支持Serializable。这个相比支持Cloneable只会工作量更大

  2 Serializable添加了更多的意义,除了提供一个方法用Serializable制作Clone,该类等于也添加了其它的public API,如果一个类实现了Serializable,等于它的2进制形式就已经是其API的一部分了,不便于该类以后内部的改动。

  3 当类用Serializable来实现clone时,用户如果保存了一个老版本的对象2进制,该类升级,用户用新版本的类反系列化该对象,再调用该对象用Serializable实现的clone。这里为了一个clone的方法又引入了类版本兼容性的问题。不划算。

  性能

  不可否认,JVM越来越快了。

  但是系统默认的native实现还是挺快的。

  clone一个有100个元素的int数组,用系统默认的clone比静态copy方法快2倍左右。

热点排行