当前页面: 开发资料首页 → J2SE 专题 → 【请教】奇怪的clone()!
【请教】奇怪的clone()!
摘要: 【请教】奇怪的clone()!
java的clone()有点让我看不懂:
1。既然所有企图重载clone的类都要implements Cloneable,为什么不把clone()定义在Cloneable接口中呢?而是蹩脚的定义在Object中,并且还搞了个奇怪的CloneNotSupportedException。C#好像就是定义在相应的接口中的吧。
2。Object.clone()好像什么也没做啊,除了被蹩脚的定义为protected之外,似乎什么也没做,而实际上它却负责着shallow copy和抛出CloneNotSupportedException的重任。难道这些都是JVM私底下做的?我们程序员怎么看不到相应的代码?
总之为什么不做成接口形式,而弄得那么古怪呢?我想其中应该有特殊考虑吧?
我好像曾经在什么地方看过这方面的介绍,Object类的最初设计clone方法是public的,后来为了安全性考虑,就搞了一个Cloneable接口,把public也改掉了。
换成接口我也觉得没问题,这样更清楚。但是为什么接口中什么方法都没有?而且Object中的clone也是什么代码也没有?Java这样设计,完全不符合通常的编程规则,是不是不太好?相比它有自己的苦中,或者有特殊的考虑,那么这些特殊考虑是什么呢?
另外我觉得对比一下.net会发现,.net似乎也是用接口来表示clone的,不过它的设计就很合乎常理,接口里有方法,父类里也提供了专门的函数来做shallow copy。不知道是不是吸取了java的教训?