什么是防御性拷贝呢(defensive copy)?

先说说可变对象和不可变对象。可变对象就是在对象构造完成之后内部构造会被改变的对象。

一个类可能包含一些方法,使得自己的内部参数被改变,这样调用者可以轻而易举的破坏掉封装,危害很大,这种时候就需要防御性拷贝。

通俗点讲,防御性拷贝的关键就在于不把原本类中的对象提供给调用者,而是创建一个(也就是拷贝一个)跟封装的类中相同的对象返回给调用者,这样,你对这个参数进行修改的时候跟封装类内部的相关参数无关,也就不会改变类中的参数。这就是防御性拷贝。

举个例子,

public Name getName(){return name;
}

这种observer则会造成类中参数被改变的风险。

防御性拷贝如下:

public Name getName(){return new Name(name.toString());
}

新建一个对象返回,这样就可以保护类中的对象。这就是防御性拷贝。

什么是Defensive Copy相关推荐

  1. 【lab2】defensive copy

    How to Defensive Copy 条件 方法返回一个mutable的数据类型 语法 without defensive copy: public Name getName(){return ...

  2. 保护性拷贝(defensive copy)

    何为保护性拷贝?看一个例子: public class Person {private String name;private Date birth;public Person(String name ...

  3. 7.39 必要时使用保护性复制(defensive copy)

    以下Period类用于表示两个日期之间的间隔: import java.util.Date;public class Period {private Date start;private Date e ...

  4. 与Brian Goetz聊Java的数据类

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ 作为Oracle的Java语言架构师,Brian Goetz一直致力于Java编程语言在生产 ...

  5. effective java读书笔记5:避免创建不必要的对象

    2019独角兽企业重金招聘Python工程师标准>>> 解读:如果不需要每次都创建一个相同功能的新对象,最好重用对象,因为有时候反复创建同样的对象是有代价的. 例如: 1.Strin ...

  6. 七周七并发之线程与锁

    2019独角兽企业重金招聘Python工程师标准>>> 七周七并发之线程与锁 博客分类: java 1.概述 1.1并发还是并行(Concurrent or Parallel) A ...

  7. 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)

    多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...

  8. Storm概念学习系列之storm-starter项目(完整版)(博主推荐)

    这是书籍<从零开始学Storm>赵必厦 2014年出版的配套代码! storm-starter项目包含使用storm的各种各样的例子.项目托管在GitHub上面,其网址为: http:// ...

  9. Retrofit2 完全解析 探索与okhttp之间的关系

    http://blog.csdn.net/lmj623565791/article/details/51304204: 本文出自:[张鸿洋的博客] 1. 概述 之前写了个okhttputils的工具类 ...

最新文章

  1. php 现货 结算算法,PHP算法逻辑:如何计算购买量?
  2. 三层架构实战篇—系统登录实例
  3. Python 技术篇-httpClient库连接服务器发送请求解析响应实例演示,No module named ‘httplib‘问题解决方法
  4. dos下实现延迟功能
  5. 201.09.22 除虫药水(线性dp)
  6. gRPC学习记录(三)--proto3知识
  7. 【JavaScript代码】使用JavaScript实现简单的区块链(签名+工作量证明机制)
  8. C# 操作符重载 模拟String
  9. android 视频恢复软件,视频恢复软件免费版
  10. bioconductor 安装包_R语言 | 你知道自己的Bioconductor版本么?
  11. 内存cgroup---CGroup中参数由来篇
  12. 不走寻常嵌入式开发路
  13. cs231n svm作业笔记
  14. 华为手机计算器程序员模式_华为手机的普通拍照模式,你真的会用吗?
  15. ps渐变怎么用和渐变工具技巧
  16. python日期计算,Python 日期的转换及计算的具体使用详解
  17. Python使用APP Inventor网络微数据库TinyWebDB
  18. iphone html5 模板,聊聊IPHONE6分辨率与适配
  19. java中PO、BO、VO、DTO、POJO、DAO是什么?
  20. 安装jupyter notebook中关于markupsafe的问题

热门文章

  1. 5-羧基四甲基罗丹明标记多肽核酸PNA|TMR-Ahx-(TAMRA-Ahx-)-PNA|荧光素标记肽核酸作用机理
  2. 毕业论文-----有关页码的全部问题
  3. Android 的Toast(吐丝框)
  4. 创业企业的发展与私募融资
  5. android 张口逐帧动画,《Android 动画》逐帧动画
  6. oracle不兼容win7 64位系统,oracle 安装 win7 64位_已经下载好系统给电脑装系统的步骤 - Win7之家...
  7. 23rwefwgbgfdg
  8. OpenLayer学习之OGC数据
  9. 美莱仕MX68 root教程_方法
  10. ACL 2016 会议论文全集