`
liangfeng366
  • 浏览: 77935 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

[item24] 必要时进行保护性拷贝

阅读更多
今天看了这一张模模糊糊的,有点晕。找了几篇播客,终于看懂了。
http://tonylian.iteye.com/blog/391256
http://hi.baidu.com/dongbomoo/blog/item/372cf18a17c4a8789e2fb42d.html
虽然java程序是一门安全的语言(safe language)。但即使在安全语言中,如果不采取一些措施,还是无法使自己与其他的类隔离开。假设类的客户会尽一切手段来破坏这个类的约束条件,在这样的前提下,你必须保护性地设计程序。所以说,从安全的角度考虑,应该设计面对客户的不良行为时仍能保持健壮性的类,无论系统的其它部分发生什么事情,这些类的约束都可以保持为真。
为保护实例的内部信息免受攻击,对构造函数的每个可变参数进行保护性拷贝是必要的。并且使用拷贝之后的对象作为实例的组件,而不使用原始对象。

例如,写了雇员这个类。我自己用的时候对其属性做一些改动稍后会被我的程序提交到后台数据库。但是前端的人员和我做接口的时候,一些查询方法需要雇员对象。但是我不想让他们对这个雇员的属性做修改后也被提交到后台数据库。
所以我可以给他们的对象都是我自己对象的拷贝。他们即使调用这个对象的一些方法改变对象的属性。后面也不会被我的程序提交到后台数据库。

http://topic.csdn.net/u/20080301/20/f0ce18e9-2fc7-4f75-9058-67a8496cc8c7.html
Effective Java》保护性拷贝无非就两条原则:
一、对构造函数的可变参数进行保护性拷贝;
二、对可变域的访问方法,只返回可变域的保护性拷贝(clone)。
什么叫不可变类?如果某个类,当创建了这个类的实例后,就不允许修改它的属性值,那么它就是不可变类。如:java.lang.String 就是一个典型的不可变类创建一个不可变类可按如下步骤:
1.把属性定义为private final类型。
2.不对外公开用于修改属性的setXXX()方法。
3.只对外公开用于读取属性的getXXX()方
以下是对播客例子中的一个修改:
创建一个可变类:Item39_Person
package enhance_chapter7;

public class Item39_Person {
	private String name;
	
    public String getName() {
       return name;
    }

    public void setName(String name) {
       this.name = name;
    }

	public Item39_Person(String name) {
		super();
		this.name = name;
	}

	public Item39_Person() {}

    
}

再创建一个经理类:
package enhance_chapter7;

public class Item39_Manager {
	private final Item39_Person person;

	
	public Item39_Person getPerson() {

		//return this.person;
		//(2)对可变域的访问方法,只返回可变域的保护性拷贝(clone)。
		return new Item39_Person(person.getName());
	}
	public Item39_Manager(Item39_Person person){
		//this.person = person;
		//(1)保护性拷贝  对构造函数的可变参数进行保护性拷贝
		//生成一个新的实例,和Test中的person不是同一个对象,则修改不影响this.person的值
		this.person = new Item39_Person(person.getName());
	}
	
		
	@Override
	public String toString() {
	  
	   return "Manager:" + this.person.getName();
	}
}


测试:
package enhance_chapter7;

public class Item39_Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Item39_Person person = new Item39_Person();
		person.setName("liangfeng366");
		
		Item39_Manager manager = new Item39_Manager(person);
		System.out.println(manager);
		
		//攻击(1)
		 person.setName("liangfeng");
	     System.out.println(manager);
	     
	     //攻击(2)
	     manager.getPerson().setName("liangfeng");
	     System.out.println(manager);
	     
	    
	     

	}

}


分享到:
评论

相关推荐

    文件选择性拷贝助手

    《文件选择性拷贝助手:实现增量发布与高效文件管理》 在软件开发过程中,IDE(集成开发环境)是我们日常工作的得力助手。然而,不同的IDE在处理项目打包时可能存在局限,例如无法实现增量打包,这往往导致了不必要...

    C++深拷贝浅拷贝

    根据提供的标题、描述和部分无法识别的内容,我们将围绕“C++深拷贝与浅拷贝”的主题进行深入探讨。在C++编程语言中,深拷贝(Deep Copy)与浅拷贝(Shallow Copy)是对象复制时经常遇到的概念。它们在内存管理和...

    C++之深拷贝和浅拷贝

    了解浅拷贝可能导致的问题,并且能够在必要时实现深拷贝构造函数,是C++程序员必备的技能。在实际开发中,深拷贝通常涉及到动态内存管理,这也需要程序员能够熟练掌握内存分配与释放的相关规则,以保证程序的正确性...

    copy的使用(深拷贝、浅拷贝)

    1. **数据一致性**:当你需要一份原始数据的备份,但不希望任何修改影响到原始数据时,应使用深拷贝。 2. **性能考虑**:浅拷贝通常比深拷贝更快,因为不需要递归复制所有嵌套对象。如果数据结构不复杂,且不需要...

    深拷贝拷贝的是内容,浅拷贝拷贝的是指针

    - **定义**:深拷贝是指在进行对象复制时,不仅复制了对象本身,还会复制该对象内部指向的所有数据。 - **特点**: - 源对象和新对象完全独立,即使其中一个对象发生了改变也不会影响另一个对象。 - 对于包含引用...

    快速拷贝软件(拷贝速度提高80%)

    快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高80%)快速拷贝软件(拷贝速度提高...

    拷贝文件by列表 - 选择性拷贝文件神器

    "拷贝文件by列表 - 选择性拷贝文件神器"是一个工具,它专为需要根据预定义文件列表进行精确拷贝操作的用户设计。这个工具可以帮助用户避免手动选择大量文件的繁琐过程,提高工作效率,尤其适用于需要定期备份特定...

    烂碟拷贝工具(绿色 烂碟拷贝工具(绿色

    总的来说,烂碟拷贝工具是IT工作者和普通用户在面对损坏光盘时的重要辅助工具,它可以帮助我们挽回可能丢失的数据,是数据保护和恢复领域不可或缺的一部分。在日常使用中,定期备份重要数据,结合这类工具,可以大大...

    深拷贝浅拷贝.zip

    在C#编程中,"拷贝"一词通常指的是创建一个对象的新实例,该实例与原始对象具有相同的数据。拷贝分为两种主要类型:浅拷贝...在实际项目中,根据具体需求选择合适的拷贝策略,可以有效地管理内存和保持数据的一致性。

    零拷贝源代码

    数据仅在内核空间内部进行一次拷贝,极大地提高了I/O性能。 3. **DMA**:在硬件层面,DMA可以让硬件设备(如网卡)直接读取或写入内存,而不需CPU参与。在零拷贝中,DMA用于将数据从磁盘传输到网络接口,或者相反,...

    VB使用指针adress进行内存拷贝

    标题提到的“VB使用指针adress进行内存拷贝”是指通过API调用来实现内存块的直接复制,以提高程序执行速度。 在VB中,由于其默认的安全特性,不直接支持指针操作,但可以通过调用Windows API函数来间接使用。...

    关于数组创建以及拷贝时的内存分配

    因此,明智地选择拷贝策略是必要的。在C++中,可以使用`std::copy`函数或`std::vector`的`assign`方法来高效地复制数组。而在Python中,考虑使用`numpy`库,它提供了高效的数组操作和内存管理。 此外,了解内存分配...

    js深拷贝与浅拷贝详解以及例子.pdf

    JS 深拷贝与浅拷贝详解以及例子 深拷贝与浅拷贝是 JavaScript 开发中常见的概念,分别对应着不同的拷贝方式。在本文中,我们将详细介绍浅拷贝和深拷贝的概念、特点、实现方法和实例。 一、浅拷贝 浅拷贝只拷贝一...

    C# 拷贝文件时的进度条

    在C#编程中,实现文件拷贝并同时显示进度条是一项常见的需求,特别是在处理大文件时,用户界面的反馈能够显著提升用户体验。本教程将详细讲解如何在Winform应用程序中实现这一功能,主要涉及C#语言、.NET框架以及...

    深拷贝和浅拷贝一些例子

    深拷贝和浅拷贝一些例子

    光速拷贝,很快速的一种拷贝软件

    用户可以一次性添加多个文件或整个目录进行复制,极大地提高了工作效率。同时,软件还支持拖放操作,使用起来非常直观方便。 至于提供的"teracopy22beta3.exe",这是"光速拷贝"的一个版本,其中"22"可能代表版本号...

    iOS深浅拷贝例子

    - 当你需要保持原始对象和副本之间的独立性,不希望修改其中一个会影响另一个时,应使用深拷贝。 - 如果对象的属性仅包含基本数据类型,或者你确定不会修改对象引用的属性,那么浅拷贝可能更合适,因为它通常效率更...

    2021-孕妇外周血浆胎儿游离DNA高通量测序筛查致病性拷贝数变异的技术标准共识.pdf

    - 在进行此类筛查时,需严格遵守相关伦理指导原则,确保孕妇的知情同意以及个人隐私的保护。 - 应当对筛查结果进行谨慎解读,避免由于误诊或过解读而导致的不必要的心理和生理负担。 7. 未来发展 - 随着基因组学...

    VS2008下批量拷贝文件,显示进度条拷贝个数和当前拷贝字节_更新

    在开发过程中,有时候我们需要进行大量的文件操作,例如批量拷贝文件。在VS2008环境下,这样的任务可以通过编程实现,同时为了提供良好的用户体验,我们还需要实时显示拷贝的进度,包括拷贝的文件个数和当前拷贝的...

    C#中的浅拷贝和深拷贝

    当对引用类型变量进行赋值时,实际上只是复制了引用地址,这意味着两个变量将共享同一块内存空间中的对象。 #### 浅拷贝(Shallow Copy) 浅拷贝是指只复制一个对象的引用,而不复制对象本身。也就是说,对于值...

Global site tag (gtag.js) - Google Analytics