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

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

 
阅读更多
克隆有“浅层克隆”、深层克隆,什么情况下需要深层克隆,个人有点想法,且看代码:
  public class DeepClone implements Cloneable {

    private int type;
    private final String special;
    private Flower aflower;
    private int size = 0;
    
    private Flower[] elements;//DeepClone自己管理这部分内存
  

    public DeepClone(int type, String special, Flower flower) {
        this.type = type;
        this.special = special;
        this.aflower = flower;
        this.elements = new Flower[10];
    }
  
    public void push(Flower e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null; // Eliminate obsolete reference
        return result;
    }

    public boolean isEmpty() {
        return size == 0;
    }
 // Ensure space for at least one more element.
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
    @Override
    public Object clone() {
        try {
            DeepClone result = (DeepClone) super.clone();
            result.elements=this.elements.clone();//(2)
            return result;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
    
    public static void main(String[] arr) {
     
        Flower flower = new Flower();
        flower.setName("Red flower");
        DeepClone source = new DeepClone(10, "GG", flower);
        
        Flower yellow = new Flower();
        yellow.setName("Yellow");
        Flower[] arrs=new Flower[]{yellow};         
        for (Flower arg : arrs)
            source.push(arg);
        
        
        System.out.println("----------源对象花朵名称---------" + source.aflower.getName());        
        DeepClone copy = (DeepClone) source.clone();
        System.out.println("----------克隆的对象花朵名称---------" + copy.aflower.getName());
        System.out.println("------source==copy------------"+(source==copy));
       
        source.type=0;
        System.out.println("----------源对象type值变化---------" + source.type);
        System.out.println("----------克隆的对象type值未发生变化,仍然为10---------" + copy.type);        
        source.aflower=null;
        System.out.println("----------源对象花朵名称变化---------" + (source.aflower==null?"null":source.aflower.getName()));
        System.out.println("----------克隆的对象花朵引用未发生变化---------" + (copy.aflower==null?"null":copy.aflower.getName()));
        
        //elements,DeepClone自己管理的内存部分
        //如果没有(2)的深层克隆,copy的elements不是克隆一份,而是原有elements的引用
        Object sourcePop=null;
        while (!source.isEmpty()){
            sourcePop=source.pop();
            System.out.println("------source elements------------"+((Flower)sourcePop).getName()); 
            
        }        
        Object copyPop=null;
        while (!copy.isEmpty()){
            copyPop=copy.pop();
            System.out.println("------copy elements------------"+((Flower)copyPop).getName());
            
        }
        System.out.println("------sourcePop==copyPop------------"+(sourcePop==copyPop));
    }
}

通过对DeepClone的测试分析,目前有如下结论:

(1)对象域需要“深层克隆”。
(2)对象数组域需要“深层克隆”。
(3)与stack的Object[] elements类似, Flower[] elements域由于是被克隆类DeepClone自己管理的数组;
  在DeepColen被克隆时必须“深层克隆”,result.elements=this.elements.clone()才能确保克隆对象有另外一份elements数组(可能是内存地址的指针)。 
分享到:
评论

相关推荐

    Java中的克隆(Clone)机制

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

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

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

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

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

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

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

    Effective Java第三版1

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

    Realtime-Voice-Clone-Chinese.zip

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

    effective java 读书笔记

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

    java clone

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

    java 深克隆 浅克隆

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

    java Clone

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

    airbnb-clone, 使用 Rails Trieu的教程克隆 Airbnb.zip

    airbnb-clone, 使用 Rails Trieu的教程克隆 Airbnb 使用 Rails 克隆 Airbnb Trieu教程访问 https://code4startup.com/projects/airalien-clone-airbnb-with-ruby-on-rails-bootstrap-jque

    clone 深度克隆对象

    在Java中,实现深度克隆通常有两种方式:一是通过实现Cloneable接口并重写Object类的clone()方法;二是使用序列化和反序列化技术。前者需要特别注意的是,只有实现了Cloneable接口的类才能调用默认的clone()方法,...

    Java深浅clone

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

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

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

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

    java 深克隆浅克隆

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

    原创Matlab克隆优化函数-clone.m

    原创Matlab克隆优化函数-clone.m 这是一个克隆优化函数的程序,希望对大家有用

Global site tag (gtag.js) - Google Analytics