一个对象要想被Clone,那么要实现Clone()接口,这个接口没有定义任何的方法,但是如果你不实现这个接口的话,调用clone方法的时候会出现 CloneNotSupportedException,这就是作者叫做mixin的接口类型。通常clone()方法可以这样覆盖:
public Object clone()
{
try {
return super.clone();
}
catch(CloneNotSupportedException e) {
}
}
public Object clone() {
try {
return super.clone();
}catch(CloneNotSupportedException e){
}
}
但是当你要clone的类里面含有可修改的引用字段的时候,那么你一定要把整个类的蓝图进行复制,如果对你clone得到的对象进行修改的时候还会影响到原来的实例,那么这是不可取的。所以应该这样clone()
public Object clone() throws CloneNotSupportedException
{
Stack Result = (Stack)super.clone();
Result.elements = (Object[])elements.clone();
Return result;
}
public Object clone() throws CloneNotSupportedException
{
Stack Result = (Stack)super.clone();
Result.elements = (Object[])elements.clone();
Return result;
}
其中elements是stack类中可修改的引用字段,注意如果elements是final的话我们就无能为力了,因为不能给他重新赋值了.其实如果不是必须的话,根本就不用它最好。
clone方法如果实现得不当会给系统带来隐藏的bug,如果非要使用类似的功能最好的办法是提供某些其他的途径(拷贝构造函数或者提供一个静态工厂方法来替代构造函数)来替代对象的拷贝,或者干脆不提供这样的能力。
Cloneable有很多问题,所以安全的说,其他的接口不应该扩展(extend)这个接口,并且为了继承而设计的类也不应该实现(implement)这个接口。
分享到:
相关推荐
darts-clone-java 用Java编写的Double-ARray Trie System克隆。 该库基于称为“快速高效”库的 。入门设置要使用Maven添加依赖项,请使用以下命令: < dependency> < groupId>...
语音克隆模型
jquery-clone-tableheader table 头部抬头固定 用于 多数据出现滚动条,看不到标题
(实战)[re:Invent 2018]-001:赛道分析-(致敬1024) 配套 train and evaluation log
matlab 鱼群算法 亲测保证可以运行 鱼群算法 鱼群算法
Facebook-login-page-clone-main-源码.rar
详细描述了java基础中的数组与方法的应用技术,以及面向对象的过程思想,有助于java初学者的入门学习。
kokoa-clone-2020-源码.rar
比nero更完美的刻录CD软件---CLONE_CD
Jlink-clone解决办法,替换文件
用 Java 语言编写的 初学者可学习的clone()
spotify-clone-源码.rar
Netflix-Clone-源码.rar
flow-clone-源码.rar
gojek-clone-源码.rar
详细的描述了Java中 clone方法使用
twitter-clone, 一种基于 Ruby on Rails的Twitter 开源克隆 twitter克隆使用 Ruby on Rails http://twitter-clone-rails.herokuapp.com/的Twitter的开源克隆。正在启动git clone https://github.co
对java clone的一些讲解,以及我个人的一些心得等等,
github-clone-all 克隆您的所有 Github 存储库,包括私有存储库。 目前限制为 100 个存储库(最多一个请求),请随时发送 PR 以支持更多。目录安装这个模块在上可用。 $ npm install -g github-clone-all 这个包需要...
git-clone-repos 通过shell命令克隆多个git仓库 安装 npm i git-clone-repos 用法 const clone = require ( 'git-clone-repos' ) ; ( async ( ) => { await clone ( [ 'git@github....