如何避免对象的浅拷贝:
为什么需要实现对象的拷贝?
拷贝是在内存中进行的,性能上比直接通过new生成对象快得多,特别是在大对象生成上,会显著提升性能。
但是对象拷贝的过程中,浅拷贝(shadow clone)也是一个比较容易忽略的问题。
package clone; public class Employee implements Cloneable{ private String name ; private Employee boss; public Employee(String _name) { name = _name; } public Employee(String _name,Employee _boss) { name = _name; boss = _boss; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Employee getBoss() { return boss; } public void setBoss(Employee boss) { this.boss = boss; } @Override public Employee clone() { Employee emp = null; try { emp = (Employee)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return emp; } }
public static void main(String[] args) { Employee boss = new Employee("陈光标"); Employee emp1 = new Employee("苦逼程序员穷困",boss); Employee emp2 = emp1.clone(); emp2.setName("碉堡程序员富贵"); //苦逼程序员选择boss emp1.getBoss().setName("葛朗台"); System.out.println("雇员 "+"\""+emp1.getName()+"\""+" 的boss是 "+"\""+emp1.getBoss().getName()+"\""); System.out.println("雇员 "+"\""+emp2.getName()+"\""+" 的boss是 "+"\""+emp2.getBoss().getName()+"\""); }
雇员 "苦逼程序员穷困" 的boss是 "葛朗台" 雇员 "碉堡程序员富贵" 的boss是 "葛朗台"
上面的代码是不是有些逆天了,雇员"碉堡的程序员"的boss不是陈光标吗?怎么????这就是java浅拷贝造成的,因为super.clone()拷贝的对象的内存地址,c,c++的会比较熟悉,也就是说emp1,emp2共用一块内存块,任一方的修改都会影响另一方,而我们需要的是把对象的所有属性都copy一份,这就是所谓的"深拷贝",下面是我们的解决方案:
@Override public Employee clone() { Employee emp = null; try { emp = (Employee)super.clone(); emp.setBoss(new Employee(emp.getBoss().getName()));//此处新建一个boss对象 } catch (CloneNotSupportedException e) { e.printStackTrace(); } return emp; }
雇员 "苦逼程序员穷困" 的boss是 "葛朗台" 雇员 "碉堡程序员富贵" 的boss是 "陈光标"
思考:虽然上面的方式能解决深拷贝的问题,假使项目中有大量的对象需进行深拷贝,每个对象都要实现Cloneable并实现clone方法,偷懒的程序员会满足现状吗?哈哈,卖个关子,明天继续上帖给答案~
相关推荐
### 编写高质量C语言...通过对本书的学习,读者不仅能掌握编写高质量代码的具体方法,还能深刻理解代码质量对于软件开发的重要性。无论是对于新手程序员还是有一定经验的开发者来说,这本书都是一本不可多得的好书。
继续上一篇文章《如何编写高质量JS代码》今次整理一下javascript函数知识点。 2.使用函数 函数给程序员提供了主要的抽象功能,又提供实现机制。函数可以独立实现其他语言中的多个不同的特性,例如,过程、方法、构造...
### Verilog代码编写规范详解 #### 一、代码编写风格的重要性 在FPGA设计领域,Verilog作为一种重要的硬件描述语言,其代码的质量直接影响到项目的...Verilog代码编写规范的制定与遵循,是实现高质量FPGA设计的基础。
3. **代码重构**:高级的C语言代码整理工具可能包含代码重构功能,比如提取函数、重命名变量、消除重复代码等,这些操作在大型项目中尤其重要,能够帮助改善代码结构,提高代码质量。 4. **代码检查**:部分工具还...
标题中的"Delphi代码整理工具"指的是专门针对使用Delphi编程语言编写的代码进行优化、格式化和整理的软件工具。Delphi是一种基于Object Pascal语言的集成开发环境,广泛用于创建Windows桌面应用程序。代码整理工具在...
为了统一代码风格,提高代码质量,我们可以使用自动代码整理工具。这些工具能够按照特定的编码规范,如K&R、LLVM或GNU等,对C代码进行格式化,使得代码更加整洁,便于阅读和维护。 本文将深入探讨C语言的自动代码...
SonarQube 代码规范整理 SonarQube 是一个静态代码分析工具,...SonarQube 代码规范整理旨在帮助开发者编写高质量、安全的代码。通过遵守这些规范,开发者可以避免常见的 bug、漏洞和异味,从而提高代码质量和安全性。
在数学建模中,算法参数的调整对于获得高质量的解是非常关键的。通过参考这些代码,参赛者可以学会如何根据具体问题选择合适的参数,甚至进行算法的创新和改进。 尽管我们没有具体的文件列表信息,仅有一个名为"new...
"java代码整理"可能指的是对已经编写完成的Java程序进行优化、重构或分类管理的过程。这个过程对于保持代码的整洁性、提高代码可读性和维护性至关重要。下面,我们将深入探讨Java编程的一些关键知识点: 1. **基础...
【代码阅读整理5】 在软件开发过程中,代码阅读是一项至关重要的技能,它涉及到对他人编写的源代码的理解、分析和评估。"代码阅读整理5"可能是某个系列教程或笔记的一部分,旨在帮助开发者提升代码理解能力,提高...
"代码整理1111.rar"这个压缩包文件很可能包含了某位开发者或团队整理的一系列关于代码规范的资源,可能是示例代码、文档或者教程。尽管我们无法看到具体的文件内容,但我们可以基于这个主题,详细阐述代码规范的重要...
这份代码规范整理不仅包含了许多针对PHP开发的细节规范,还指出了编写高质量、易于协作的代码需要注意的方方面面。遵循这些规范,开发者能够编写出更加清晰、一致的代码,从而提高开发效率和项目质量。对于想要快速...
这个压缩包文件“CSP一二题代码整理(2018年-2022年)”显然是一个集合,包含了2018年至2022年间CSP比赛一、二类问题的解题代码。通过这些代码,我们可以深入学习CSP考试中常见问题的解决策略和编程技巧。 首先,...
因此,使用勘误文档及时纠正,有助于培养良好的编程习惯,为写出高质量代码打下坚实的基础。 再者,学习编程不仅是学习语法和代码,更是一种思维训练的过程。通过批判性地阅读书籍内容,读者能够锻炼发现潜在问题的...
总之,IndenterVB6作为一款免费的VB6代码格式整理工具,是提升VB6编程效率和代码质量的好帮手。通过自动化整理代码,开发者可以更专注于逻辑实现,而非琐碎的格式调整工作,从而提高生产力,为软件开发带来显著的...
6. **单元测试**:通过编写测试代码来验证功能模块的正确性,确保软件质量。在C#中,常用的单元测试框架有NUnit、xUnit等。 以上就是基于标题和描述所推测的C#基础编程知识要点,以及可能在压缩包中涉及的高级主题...
《高质量C/C++编程指南》是一本以作者林锐博士的未出版手稿为基础,整理成的规范化文件,主要用于上海贝尔网络应用事业部的内部培训和规范制定。这本书旨在分享C++/C编程的良好实践,鼓励知识共享,但同时也对版权和...
### C++高质量编程知识点概述 #### 一、文件结构与头文件管理 ...以上内容是根据《学习整理C++高质量编程简介》中的部分内容总结的关键知识点。遵循这些准则和最佳实践有助于编写出高效、可维护且易于理解的C++代码。