虽然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
- packageenhance_chapter7;
- publicclassItem39_Person{
- privateStringname;
- publicStringgetName(){
- returnname;
- }
- publicvoidsetName(Stringname){
- this.name=name;
- }
- publicItem39_Person(Stringname){
- super();
- this.name=name;
- }
- publicItem39_Person(){}
- }
再创建一个经理类:
- packageenhance_chapter7;
- publicclassItem39_Manager{
- privatefinalItem39_Personperson;
- publicItem39_PersongetPerson(){
- returnnewItem39_Person(person.getName());
- }
- publicItem39_Manager(Item39_Personperson){
- this.person=newItem39_Person(person.getName());
- }
- @Override
- publicStringtoString(){
- return"Manager:"+this.person.getName();
- }
- }
测试:
- packageenhance_chapter7;
- publicclassItem39_Test{
- publicstaticvoidmain(String[]args){
- Item39_Personperson=newItem39_Person();
- person.setName("liangfeng366");
- Item39_Managermanager=newItem39_Manager(person);
- System.out.println(manager);
- person.setName("liangfeng");
- System.out.println(manager);
- manager.getPerson().setName("liangfeng");
- System.out.println(manager);
- }
- }
分享到:
相关推荐
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
Java学习笔记:JavaSe、Spring、JVM、MySQL、MyBatis...
java学习笔记java学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记...
java学习笔记,java基础知识,只用于个人学习。
JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记
java学习笔记.doc java学习笔记 java学习 学习笔记 java
Java项目学习笔记: SSM实战项目——Java高并发秒杀API,详细流程+学习笔记
Java基础 java学习笔记 Java Java基础Markdown学习笔记,可转换成PDF、Word等格式
在学习java过程中的笔记。
Java Swing组件:Jlist学习笔记Java Swing组件:Jlist学习笔记
java学习笔记java学习笔记java学java学习笔记习笔记
java学习笔记
狂神说java学习笔记,markdown版
良葛格的Java学习笔记~讲解得非常详细。JDK5.0的~是Java入门的不错选择。
Java学习笔记(必看经典) Java学习笔记(必看经典) Java学习笔记(必看经典)
(完整版)最全的java学习笔记(必看).pdf
Java 学习笔记.pdf Java 学习笔记.pdf Java 学习笔记.pdf Java 学习笔记.pdf
Java JDK 5.0学习笔记:TP312JA L393.iso 随书光盘,欢迎大家下载 大家共享^A^
java学习笔记,从0开始学习 java学习笔记,从0开始学习 java学习笔记,从0开始学习 java学习笔记,从0开始学习 java学习笔记,从0开始学习 java学习笔记,从0开始学习 java学习笔记,从0开始学习 java学习笔记,从0...