23、保护性拷贝

程序有可能被恶意的使用,也就是遭受攻击,对于一个类来说,如果能够合适地使用保护性拷贝,将会使得类的安全性增大,例如:

 1 class Person{
 2     private String name;
 3     public Person(String name) {
 4         this.name = name;
 5     }
 6
 7     private Person getPerson() {
 8         return new Person(name);
 9     }
10
11     public void setName(String name){
12         this.name = name;
13     }
14
15     public Person say(String content){
16         System.out.println(name + " say:" + content);
17         return getPerson();
18     }
19
20     @Override
21     public String toString() {
22         return "Person [name=" + name + "]";
23     }
24
25
26 }
27
28
29
30 public static void main(String[] args) {
31         Person person = new Person("lay");
32
33         Person person2 = person.say("hahah");
34         person2.setName("marry");
35         person2.say("hehehe");
36
37         person.say("what");
38 }

如上所示,不管使用方如何setName都只是修改了拷贝出来的数据,而person的原始数据很好地被隐藏起来。

主要因素在于,java的引用机制,多个引用指向同一个内存空间,因此只要修改引用的数据就能够破坏既定的数据。因此,我们可以利用拷贝新的内容来隐藏原始数据

时间: 2024-10-19 15:31:53

23、保护性拷贝的相关文章

第七章:方法。ITEM39:必要时进行保护性拷贝。

1 package com.twoslow.cha7; 2 3 import java.util.Date; 4 5 public final class Period { 6 7 private final Date start ; 8 private final Date end ; 9 10 public Period(Date start , Date end) { 11 if(start.compareTo(end) > 0) 12 throw new IllegalArgumentE

第39条:必要时进行保护性拷贝

Java是一门安全的语言,但是如果不采取措施,还是无法保证安全性.假设类的客户端会尽其所能来破坏类的约束条件,因此必须保护性地设计程序. 考虑下面的类,声称表示一段不可变的时间周期: import java.util.Date; public final class Period { private final Date start; private final Date end; public Period(Date start, Date end) { if(start.compareTo(

必要时进行保护性拷贝

假设类的客户端会尽其所能来破坏这个类的约束条件,因此你必须保护性的设计程序.demo: 1 import java.util.Date; 2 3 public final class Period { 4 private final Date start; 5 private final Date end; 6 public Period(Date start,Date end) { 7 if(start.compareTo(end) > 0){ 8 throw new IllegalArgum

第三十九条:必要时进行保护性拷贝

使Java使用起来如此舒适的一个因素在于,它是一门安全的语言.这意味着,它对于缓冲区溢出,数组越界,非法指针以及其他的内存破坏 都自动免疫,而这些错误却困扰着诸如C和C++这样的不安全语言.在一门安全的语言中,在设计类的时候,可以确切的知道,无论系统的 其他部分发生什么事情,这些类的约束都可以保持为真.对于那些"把所有的内存当成一个巨大的数组来看待"的语言来说,这是不可能的. 有一种情况进行保护性拷贝就是需要的: public  class   Period { private   f

夺命雷公狗—angularjs—23—copy拷贝对象

copy这在angularjs中是一个拷贝对象的方法: <!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/angular.min.js"></script>

EffectiveJava笔记

1.考虑用静态工厂方法代替构造函数(Integer.valueOf(),Boolean.valueOf())    1.静态方法有方法名进行分辨    2.静态方法不一定非要新建一个对象,new 方法肯定会新建对象    3.可以返回子类对象(?)    1b.    2b.与其他静态方法没有区别2.私有构造函数强化单例3.私有构造函数防止被实例化或子类实例化4.避免创建重复对象:如String s=new String("Hello world");//不推荐5.消除过期的引用对象:

【电子书】Effective Java中文版下载

下载地址: 点击打开链接 (需要资源0分的联系我~) <Effective Java中文版(第2版)>主要内容:在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案.通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰.健壮和高效的代码.第2版反映了Java 5中最重要的变化,并删去了过时的内容. <Effective Java中文版(第2版)>中的每条规则都以简短.独立的小文章形式出现,并

java编程的78条黄金法则

创建和销毁对象 1.考虑用静态工厂方法(返回类的实例的静态方法)代替构造器2.遇到多个构造器参数时要考虑用构造器3.用私有构造器或者枚举类型强化Singleton属性4.通过私有构造器强化不可实例化的能力5.避免创建不必要的对象6.消除过期的对象引用7.避免使用终结(final)方法 对于所有对象都通用的方法 8.覆盖equals时请遵守通用约定9.覆盖equals时总要覆盖hashCode10.始终要覆盖toString11.谨慎地覆盖clone12.考虑实现Comparable接口 类和接口

reading notes —— effective Java;目录结构,便于复习与查找

第1章 引言 第2章 创建和销毁对象 第1条:考虑用静态工厂方法代替构造器 第2条:遇到多个构造器参数时要考虑用构建器 第3条:用私有构造器或者枚举类型强化Singleton属性 第4条:通过私有构造器强化不可实例化的能力 第5条:避免创建不必要的对象 第6条:消除过期的对象引用 第7条:避免使用终结函数 第3章 对于所有对象都通用的方法 第8条:改写equals时请遵守通用约定 第9条:改写equals时总要改写hashCode 第10条:始终要改写toString 第11条:谨慎地改写clo