`
lxiaodao
  • 浏览: 121293 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

EffectiveJava-第11条 谨慎地覆盖克隆clone

阅读更多
1、clone方法的通用约定是非常弱的
   x.clone()!=x
   x.clone().getClass()==x.getClass()
   x.clone().equals(x)
   都不是绝对的要求
  
2、Clone方法就是另一个构造器,你必须保证它不会伤害到原始的对象,并确保正确地创建被克隆对象中的约束条件。

3、clone架构与应用可变对象的final域的正常用法是不兼容的。

4、深度clone,典型例子HashTable
  
5、线程安全的类实现Cloneable接口,clone方法必须实现好同步:HashTable。
public class DeepClone {
   public  static void main(String[] arr){
	   Hashtable<String, Integer> table=new Hashtable<String, Integer>();
	   table.put("MM", 100);
	   
	   Hashtable<String, Integer> copytable=(Hashtable) table.clone();
	   System.out.println("----------mm----------"+copytable.get("MM"));
	   
	   
   }
}


总结:
 
(1)默认实现方式
   实现了Cloneable接口的类都应该有一个公用的方法覆盖clone:
   
   @Override public PhoneNumber clone() {
     super.clone();
   }
   此公有方法首先调用super.clone(),然后修正任何需要修正的域(浅克隆、深度克隆)。
(2)最佳实践
   实现对象的拷贝的好办法是提供一个拷贝构造器(copy constructor)或者拷贝工厂(copy factory)
   相比Cloneable/clone优点:
   不依赖于某一种很有风险的,语言之外的对象创建机制;
   不要求遵守尚未制定好的文档规范;
   不会与final域的正常使用发生冲突;
   不会抛出不必要的受检查异常CloneNotSupportedException;
   不需要强制进行类型转换;  
建议使用最佳实践
/**
 * 拷贝构造器(copy constructor)或者拷贝工厂(copy factory)展示
 * @author Administrator liuyang
 * Dec 23, 2009-12:05:00 AM
 */
public class GoodClone {
	private int type;
	private final String special;

	public GoodClone(int type, String spe) {
		this.type = type;
		this.special = spe;
	}
    /**
     * 拷贝构造器
     * @param good
     */
	public GoodClone(GoodClone good) {
		this.special = good.special;
		this.type = good.type;
	}
    /**
     * 拷贝工厂
     * @param good
     * @return
     */
	public static GoodClone newInstance(GoodClone good) {
		return new GoodClone(good.type, good.special);
	}

	public static GoodClone cloneInstance(GoodClone good) {
		return new GoodClone(good.type, good.special);
	}

	public static void main(String[] arr) {
		GoodClone entity = new GoodClone(10, "spacialGood");
		GoodClone copyEd1 = GoodClone.newInstance(entity);
		System.out.println("----------克隆方式newInstance-----------"
				+ (entity == copyEd1));

		GoodClone copyEd2 = new GoodClone(entity);
		System.out.println("----------克隆方式2-----------" + (entity == copyEd2));

		System.out.println("----------克隆方式1与克隆方式2-----------"
				+ (copyEd1 == copyEd2));
	}
}


0
0
分享到:
评论

相关推荐

    Java中的克隆(Clone)机制

    在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...

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

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

    Realtime-Voice-Clone-Chinese.zip

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

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,该书的第三版继续提供了关于如何编写高效、优雅、可维护的Java代码的指导。以下是基于给出的目录和部分内容提取的一些关键知识点: ### 第一...

    effective java 读书笔记

    - Item11:谨慎覆盖clone方法,因为它涉及到对象的深拷贝,可能需要实现`Cloneable`接口并处理异常。 - Item12:实现Comparable接口使对象能够自我比较,这对于排序和集合操作非常有用。 5. **类和接口的设计** ...

    gitlab-group-clone:递归克隆整个gitlab组树的工具

    gitlab 克隆 用于将整个 gitlab 结构轻松克隆到本地机器的工具。 自由软件:MIT 许可证 要求 要求 Python&gt; = 3.6 安装 您可以通过安装“ gitlab-clone”: $ pip install gitlab-clone 用法 &gt;&gt;&gt; gitlab - clone: ...

    中文语音克隆内含数据集和预训练模型:voice clone.zip

    "voice clone.zip"这个压缩包文件包含了实现这一技术的关键组成部分:数据集和预训练模型。让我们深入探讨一下这两个核心要素以及它们在中文语音克隆中的作用。 首先,数据集是训练任何机器学习模型的基础。在语音...

    git-fastclone, 关于类固醇,git clone 递归.zip

    git-fastclone, 关于类固醇,git clone 递归 fastclone git fastclone是类固醇的git clone --recursive 。为什么 fastclone?在特定机器上进行大量重复签出?知识库 1st Fastclone 2nd Fastc

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

    本文将深入探讨如何解决Jlink-clone带来的问题,并提供一种可能的解决方案——替换文件。 首先,理解问题的本质至关重要。Jlink-clone可能存在的问题包括固件不完整、软件兼容性差、速度慢、不稳定或者丢失某些服务...

    java clone

    在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象克隆。本文将深入探讨Java中的`clone`方法,包括其工作原理、使用场景、注意事项以及一些个人实践心得。 首先,让我们理解什么是`clone`。...

    java 深克隆 浅克隆

    在Java编程语言中,克隆是一种创建对象副本的方法,它允许我们复制一个对象并得到一个与原对象相同但独立的新对象。克隆分为两种主要类型:深克隆和浅克隆。理解这两种克隆的区别是Java面向对象编程中的重要概念。 ...

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    git-clone-repos:通过shell命令克隆多个git仓库

    git-clone-repos 通过shell命令克隆多个git仓库 安装 npm i git-clone-repos 用法 const clone = require ( 'git-clone-repos' ) ; ( async ( ) =&gt; { await clone ( [ 'git@github....

    jlink v9 warning clone解决

    `jlink v9 warning clone`问题通常涉及到JLink版本9在与MDK配合使用时遇到的警告,提示可能与克隆设备或非法设备相关。 标题中的"jlink v9 warning clone解决"意味着开发者正在尝试解决关于JLink v9版本出现的克隆...

    Java深浅clone

    在本文中,我们将深入探讨Java中的浅克隆(shallow clone)和深克隆(deep clone),并结合测试代码进行分析。 首先,让我们理解`Cloneable`接口。在Java中,如果一个类想要支持`clone()`方法,它必须实现`...

    克隆管理CLONE克隆管理克隆管理克隆管理

    克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理克隆管理...

    java 深克隆浅克隆

    在Java编程语言中,克隆是一种创建对象副本的方法,它允许我们复制一个对象并拥有一个完全独立的新实例,而不是仅仅引用原始对象。克隆技术在处理复杂数据结构、避免对象共享以及实现对象复制等方面有着广泛的应用。...

Global site tag (gtag.js) - Google Analytics