`
elite20130514
  • 浏览: 45304 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

读编写高质量代码整理(二)

阅读更多

如何避免对象的浅拷贝:

为什么需要实现对象的拷贝?

拷贝是在内存中进行的,性能上比直接通过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方法,偷懒的程序员会满足现状吗?哈哈,卖个关子,明天继续上帖给答案~

分享到:
评论

相关推荐

    如何编写高质量JS代码(续)

    继续上一篇文章《如何编写高质量JS代码》今次整理一下javascript函数知识点。 2.使用函数 函数给程序员提供了主要的抽象功能,又提供实现机制。函数可以独立实现其他语言中的多个不同的特性,例如,过程、方法、构造...

    如何编写高质量JS代码

    难得挤出一点点时间,绝不睡懒觉,整理总结往日所看的书,只为了可以离写自己的类库近一点。 本文参考自《javascript语言精粹》和《Effective JavaScript》。例子都被调试过,理解过后,我想把一些“深奥”的道理说...

    MATLAB的数据采集与分析系统源代码

    图像处理日益成为一门引人注目、前景远大的学科,而MATLAB语言以强大的科学运算、灵活程序设计流程、高质量的图形可视化与界面设计、与其他程序和语言便捷的接口功能,成为当今国际上科学界最具影响力、最有活力的...

    C语言难点分析整理

    59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 ...

    免费下载:C语言难点分析整理.doc

    59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 ...

    C语言难点分析整理.doc

    59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全...

    matlab简单计算程序代码-robin:稳健的文档图像二值化

    robin是用Python编写的RO胸像文档图像BIN整理工具。 robin-快速的文档图像二值化工具; 指标-用于衡量二值化质量的脚本; 数据集-DIBCO 2009-2018,《棕榈叶手稿》和我自己的具有原始图像和真实图像的数据集的链接;...

    c语言难点分析整理,C语言

    59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 ...

    软件设计与体系结构期末复习笔记(xinhua)

    高质量代码的四个基本特性:(记忆) ① 正确性 ② 简单性 ③ 可读性 ④ 可测试性 软件设计模式(Software Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结...

    2023年 java最新学习资料

    1.java_插件 2.Java学习笔记(必看经典).doc 3.Java注释规范整理.docx 4.java泛型.docx 5.java笔记.txt 6.java调试.doc 7.JDK系统变量的配置.txt ...9.编写高质量Java代码.pdf 10.设计模式pptx 11.输入输出重定向.txt

    Investigate_the_Movie_Database_-TMDb-:用Python编写的代码用于调查10,000部电影

    研究电影数据库(TMDb):目录: ...数据整理: 分析的第二步是数据整理,它包括通过视觉和程序评估TMDb Movies数据集,识别是否存在整洁问题,然后提高其质量,这将有助于我们稍后分析数据并得出结论。数据清理(提

    java版飞机大战源码-Resources:收集资源

    如何编写高质量的代码 JS Eslint CSS 浏览器调试技巧 编辑器 Java DB SQL Server MyBatis 日志 RESTful 设计模式 前端 项目 浏览器 IE IE添加受信站点会导致网页对话框中不显示浏览器地址。 IE插件开发 跨域 缓存 ...

    Flash ActionScript 3.0高级动画教程

    编写网格代码 测试并调整网格 整理成类 使用此类 检测不只是为了碰撞 总结 第二章 转向 行为 行为 2D向量(Vector2D)类 机车(Vehicle)类 转向机车(SteeredVehicle)类 寻找行为 避开行为 到达行为 追捕行为 躲避行为 ...

    高级C语言详解

    59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 ...

    react-redux-saga-boilerplate:准备好进行Web和移动应用程序开发的monorepo前端样板。 通过react,redux和redux-saga实现。 用TypeScript编写

    有时由于经济上的时间压力,很难交付高质量的软件。 通过这个项目,我试图提供最佳实践的前端样板。 希望能节省开发人员和其他利益相关者的神经。 知识库 为了完全理解该项目,您应该熟悉以下技术。 (monorepo管理...

    高级C语言 C 语言编程要点

    59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 ...

    深入理解JavaScript系列.chm

    1.编写高质量JavaScript代码的基本要点 2.揭秘命名函数表达式 3.全面解析Module模式 4.立即调用的函数表达式 5.强大的原型和原型链 6.S.O.L.I.D五大原则之单一职责SRP 7.S.O.L.I.D五大原则之开闭原则OCP 8.S.O.L.I.D...

    Transformer架构下的量价选股策略:ChatGPT核心算法应用于量化投资.pdf

    ChatGPT作为基于GPT模型的大型对话式语言模型,不止在文本生成和代码编写领域有着高质量的应用,同时也在其他领域有所涉猎。本篇报告就将聚焦于其核心算法Transformer,在量化投资策略中的运用。

    高级进阶c语言教程..doc

    59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 ...

    leetcode题库-MyNote:`13的学习笔记

    Python》(编写高质量Python代码的59个有效方法) 《流畅的python》 源码学习 学习笔记 Python 自用工具代码库 Scheme 学习笔记 Scheme 学习笔记 《计算机程序的构造和解释》 学习笔记及部分例题答案 Verilog DHL 学习...

Global site tag (gtag.js) - Google Analytics