`
javawebsoa
  • 浏览: 425512 次
社区版块
存档分类
最新评论

Java学习笔记:(34)必要时进行保护性拷贝

 
阅读更多
虽然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
Java代码 收藏代码
  1. packageenhance_chapter7;
  2. publicclassItem39_Person{
  3. privateStringname;
  4. publicStringgetName(){
  5. returnname;
  6. }
  7. publicvoidsetName(Stringname){
  8. this.name=name;
  9. }
  10. publicItem39_Person(Stringname){
  11. super();
  12. this.name=name;
  13. }
  14. publicItem39_Person(){}
  15. }

再创建一个经理类:
Java代码 收藏代码
  1. packageenhance_chapter7;
  2. publicclassItem39_Manager{
  3. privatefinalItem39_Personperson;
  4. publicItem39_PersongetPerson(){
  5. //returnthis.person;
  6. //(2)对可变域的访问方法,只返回可变域的保护性拷贝(clone)。
  7. returnnewItem39_Person(person.getName());
  8. }
  9. publicItem39_Manager(Item39_Personperson){
  10. //this.person=person;
  11. //(1)保护性拷贝对构造函数的可变参数进行保护性拷贝
  12. //生成一个新的实例,和Test中的person不是同一个对象,则修改不影响this.person的值
  13. this.person=newItem39_Person(person.getName());
  14. }
  15. @Override
  16. publicStringtoString(){
  17. return"Manager:"+this.person.getName();
  18. }
  19. }

测试:
Java代码 收藏代码
  1. packageenhance_chapter7;
  2. publicclassItem39_Test{
  3. /**
  4. *@paramargs
  5. */
  6. publicstaticvoidmain(String[]args){
  7. Item39_Personperson=newItem39_Person();
  8. person.setName("liangfeng366");
  9. Item39_Managermanager=newItem39_Manager(person);
  10. System.out.println(manager);
  11. //攻击(1)
  12. person.setName("liangfeng");
  13. System.out.println(manager);
  14. //攻击(2)
  15. manager.getPerson().setName("liangfeng");
  16. System.out.println(manager);
  17. }
  18. }

分享到:
评论

相关推荐

    (完整版)最全的java学习笔记(必看).pdf

    * 1.2 Java特点:Java语言的特点包括平台独立性、对象oriented、分布式、基于组件的、安全、高性能等。 * 1.3 Java开发环境:Java开发环境包括Java Development Kit(JDK)、Eclipse、Myeclipse等。JDK是Java开发的...

    Java学习笔记:JSONObject与JSONArray的使用.docx

    Java学习笔记:JSONObject与JSONArray的使用.docx

    Java学习笔记:JSONObject与JSONArray的使用.pdf

    Java学习笔记:JSONObject与JSONArray的使用.pdf

    Java学习笔记学习笔记

    Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...

    林信良java学习笔记

    《林信良Java学习笔记》是一本深受程序员喜爱的Java学习资源,尤其因其繁体字版,对于中文读者来说,提供了更为亲切的阅读体验。这本书深入浅出地讲解了Java编程语言的基础知识和高级特性,旨在帮助初学者快速掌握...

    林信良JAVA学习笔记

    著作:《JAVA 学习笔记》、《Spring 技术手册》,为SUN官方教材主要编写成员之一 博客: http://blog.csdn.net/caterpillar_here 详细信息: http://www.china-pub.com/computers/common/info.asp?id=31664

    java学习笔记1

    Java学习笔记1 Java学习笔记1是学习Java过程中的笔记,主要记录了Eclipse开发环境中的快捷键使用、编辑功能、查找和调试等知识点。 Eclipse快捷键 Eclipse中有许多快捷键,掌握这些快捷键可以大大提高开发效率。...

    Java 学习笔记Java学习笔记

    6. 网络编程:Java提供Socket和ServerSocket类进行网络通信,支持TCP和UDP协议。此外,HttpURLConnection和HttpClient类可以处理HTTP请求。 7. 多线程:Java内置了对多线程的支持,通过Thread类或实现Runnable接口...

    java学习笔记.zip

    java学习笔记java学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记...

    Java基础 学习笔记 Markdownr版

    1. 面向对象(OOP):Java的核心是面向对象编程,它将数据和操作数据的方法封装在一起,形成类。面向对象的三大特性——封装、继承和多态,在06面向对象(上)、07面向对象(中)和08面向对象(下)中进行了详细介绍...

    Java学习笔记——良葛格

    "Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...

    Java学习笔记(必看经典).pdf

    本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...

    《java学习》-java学习笔记.zip

    这份《java学习》笔记包含了多个核心主题,旨在帮助初学者和有经验的开发者深入理解和掌握Java技术。 1. **正则表达式(正则.md)**: 正则表达式在Java中用于文本匹配和搜索,是处理字符串的强大工具。Java提供了...

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    JAVA学习笔记 林信良

    《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...

    java学习笔记.pdf

    "Java学习笔记" 本资源是一个关于Java编程语言的学习笔记,涵盖了Java的基础知识、语法、数据类型、变量、类型转换等方面的内容。 标题:"java学习笔记.pdf" 描述:"想自学的小伙伴可以看俺" 标签:"Java" 部分...

    韩顺平编写的java学习笔记(全)

    ### 韩顺平编写的Java学习笔记概览 #### Java平台分类与运行机制 - **J2SE(Java 2 Platform, Standard Edition)**: 标准版Java开发平台,适用于桌面应用程序开发。 - **J2EE(Java 2 Platform, Enterprise ...

    Java学习笔记及心得

    #### 标题:Java学习笔记及心得 #### 描述:Core Java 学习笔记及心得 pdf格式可打开。涵盖了java的基础入门知识,非常适合自学的及想深入学习理解的同学。 #### 标签:Java、基础入门、学习笔记 #### 知识点详细...

    Java JDK 5.0学习笔记:TP312JA L393.iso

    Java JDK 5.0学习笔记:TP312JA L393.iso 随书光盘,欢迎大家下载 大家共享^A^

    瑜琅java学习笔记

    - **简单性**:Java设计时考虑到易学性和易用性,避免了C++等语言中的复杂特性。 - **安全性**:通过沙箱模型等机制确保代码在安全环境中运行。 - **可移植性**:编写一次,到处运行(Write Once, Run Anywhere, ...

Global site tag (gtag.js) - Google Analytics