`
schumee
  • 浏览: 25847 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Effective Java 学习笔记第10条 --- 谨慎地改写clone

阅读更多

一个对象要想被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)这个接口。

分享到:
评论

相关推荐

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    Realtime-Voice-Clone-Chinese.zip

    综上所述,“Realtime-Voice-Clone-Chinese.zip”所代表的实时中文语音克隆模型是人工智能领域的一个重要突破,它不仅展示了深度学习在语音处理中的强大能力,也为未来的创新应用开辟了新的道路。随着技术的进一步...

    darts-clone-java:用Java编写的DARTS(Double-ARray Trie System)克隆

    darts-clone-java 用Java编写的Double-ARray Trie System克隆。 该库基于称为“快速高效”库的 。入门设置要使用Maven添加依赖项,请使用以下命令: < dependency> < groupId>...

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多最佳实践和设计原则,帮助开发者写出更高效、更可维护的代码。第三版延续了这一传统,对Java语言的新特性进行了更新,并给出了...

    Effective-Java读书笔记

    9. **谨慎地覆盖clone()**:Java的clone()方法有其复杂性,除非有特殊需求,否则通常建议使用拷贝构造器或工厂方法来复制对象。 10. **使用泛型**:泛型提供编译时类型检查,减少类型转换错误,使代码更易读,更...

    2018-real-clone2-10.8s.rar

    在本资源中,我们关注的是一个与2018年re:Invent活动相关的实战项目,特别是关于"强化学习"的实践应用。re:Invent是亚马逊AWS每年举办的一场大型技术会议,涵盖云计算、机器学习、人工智能等多个领域。在这个实战...

    MT管理器_2.14.5-clone.apk

    MT管理器_2.14.5-clone.apk

    Jlink-clone解决办法,替换文件.rar

    当遇到"Jlink-clone"问题时,这通常指的是遇到了非原厂生产的、可能功能受限或者不稳定版本的J-Link设备。这类克隆设备可能会有兼容性问题、性能下降或不支持某些高级功能。本文将深入探讨如何解决Jlink-clone带来的...

    NX二次开发UF-CLONE-ask-clone-related-dwgs 函数介绍

    NX二次开发UF_CLONE_ask_clone_related_dwgs 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    NX二次开发UF-CLONE-ask-clone-related-cae 函数介绍

    NX二次开发UF_CLONE_ask_clone_related_cae 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    NX二次开发UF-CLONE-set-clone-related-cae 函数介绍

    NX二次开发UF_CLONE_set_clone_related_cae 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    NX二次开发UF-CLONE-set-clone-related-dwgs 函数介绍

    NX二次开发UF_CLONE_set_clone_related_dwgs 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域...

    CLONE 10-ex

    标签“KYO CLONE 10”可能是这个工具的特定品牌或者开发者,"KYO"可能是一个公司或者开发团队的名称,他们专注于克隆技术,并且已经发展到了第10代产品。 由于提供的压缩文件名为“Clone10-EX-LV2”,我们可以推测...

    PyPI 官网下载 | django-clone-1.1.9.tar.gz

    标题"PyPI 官网下载 | django-clone-1.1.9.tar.gz"表明这是从Python Package Index (PyPI) 官网上下载的一个压缩包,包含了一个名为`django-clone`的软件包的版本1.1.9。PyPI是Python开发者发布自己开发的Python模块...

    java clone

    总结来说,Java中的`clone`方法是一种快速创建对象副本的手段,但它需要谨慎使用,特别是在处理包含复杂数据结构的对象时。理解其工作原理,以及何时和如何正确地使用`clone`,对于提升代码质量和效率至关重要。在...

    Java clone方法使用

    详细的描述了Java中 clone方法使用

    twitter-clone, 一种基于 Ruby on Rails的Twitter 开源克隆.zip

    twitter-clone, 一种基于 Ruby on Rails的Twitter 开源克隆 twitter克隆使用 Ruby on Rails http://twitter-clone-rails.herokuapp.com/的Twitter的开源克隆。正在启动git clone https://github.co

    Effective-java-3e-source-code:有效Java第三版的源代码,并进行了必要的补充以使其可运行

    《有效Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高质量、高效Java代码的最佳实践。第三版的源代码提供给了开发者一个宝贵的资源,可以直接研究和学习书中提到的各种编程技巧和设计模式...

Global site tag (gtag.js) - Google Analytics