‘防御式拷贝‘

表示泄露是极坏的。如果再碰上一个家长出门的熊孩子看到还开着的电脑,结局可能就是一个被打一个被开,一个配上“他还只是个孩子啊”可能下次还敢,一个丢了生计不知何时才能重新工作。程序员应当是负主要责任的,“熊孩子”千千万,但凡做好防御式拷贝,都可以直接在灯火阑珊处等他们来捣乱了。

防御式拷贝

防御式拷贝,其实就是返回一个全新的对象,可以这样理解:一个孩子很喜欢一个比较脆弱的名贵物品,想要得到它,那么我们用防御式拷贝给他造一个一模一样的(根据唯物主义,真正有价值的还是原本那个),随便他怎么去处置我们造出来的,既给了他的开心,又避免了表示泄露。
一个很典型的例子就是Date和List。它们俩都是可变数据类型,如果不使用防御式拷贝,而仅仅是在原对象上再加一个引用,那么就可能引发严重的错误——如果原先的Date存的是一个纪念日,这时候把它传给一个伙计,伙计发现自己的一个纪念日刚刚好一个月后,于是直接在Date对象上修改它的月份,那么此对象原先创造出来的本意就被改变了,这是我们不希望看到的。
请添加图片描述
所以,对Date对象使用防御式拷贝是十分必要的,即所有的Date对象x返回的都应该是:

return new Date(x.getTime());

这样就能避免由于一旦被无意中改变造成的非常难于跟踪和发现的错误。
在lab2中也有很多地方用到了防御式拷贝:

//返回包含所有的顶点的集合
/**
* Get all the vertices in this graph.
* 
* @return the set of labels of vertices in this graph
*/
@Override public Set<L> vertices() {
  	return new HashSet<>(vertices);
}
/**
 * Get the edges from the vertex.
 *
 * @return the edges pair (source, weight) from the vertex
*/
public Map<L, Integer> getTargets() {
    return new HashMap<>(targets);
}
/**
 * Check whether there is an edge from source to vertex.
 *
 * @param source the target to check
 */
public boolean connectFrom(L source) {
    return sources.containsKey(source);
}

关于防御式拷贝,其实也就这么多东西,只是养成这样一个习惯还是比较困难的,总会有那么几个返回直接返回了原来的可变对象。所以,在不变数据类型和可变数据类型与防御式拷贝之间的Compromise需要我们来衡量。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
80%的用户流量网页时不会通过电话联系,一款用户体验良好的客服系统 customer service system (俗称商务通)能帮您抓住每一位客户。最常用的有QQ在线客服等,有的需要安装客户端、有的数据库不在本地第三方可看到聊天记录、有的又需要按每年收取上千大洋的服务费。一款基于B/S架构的网站在线客服软件或许能解决上述问题!获得最新版本与技术支持联系电话:15559697913 。 Me客服系统特点: 1、通过浏览器就能聊天,兼容市面上所有浏览器,Socket优化主机负载小,Pdo防御性能良好; 2、提供多套界面风格和4个客服坐席满足不同网站需求,并且未绑定域名可部署在多个网站上; 3、系统数据库配置本地放心、附带部分OA功能2次加密更安全、类似QQ微信界面的左右分离聊天更美观; 4、含有丰富的表情功能、消息提示音、客户下线通知功能,让您的聊天声情并茂~ 管理员可查看任何一个客服聊天记录、修改客服名称与密码; 如何安装Me客服系统? 1、将整个客服系统文件拷贝到网站根目录下,打开default.php文件,将里边的CSS、DIV和JS客服代码拷贝到网站首页; 2、找到 /Me/msdb.sql 文件,导入到数据库,之后删除msdb.sql文件; 3、找到 /Me/base.php 文件,配置数据库用户名与密码; 4、登陆后台为 /Me/000000/index.html,建议修改为其他文件名。4个客服与1个管理员的用户名分别为:webu1、webu2、webu3、webu4、adminot,密码都是123456,建议管理员登陆后修改密码; PS:软件经过长期算法调优性能更加卓越,演示版本与说明文档参看官网 www.05090.net 手机端正在开发中敬请期待。
### 回答1: Vue 使用 `JSON.parse(JSON.stringify(obj))` 来深拷贝响应数据。但是,这种方法会丢失对象的响应性质,因此需要使用 Vue.set(target, key, value) 或 Vue.delete(target, key) 来重新设置响应性质。 如果数据量很大,建议使用第三方库进行深拷贝,如 lodash 中的 _.cloneDeep() 方法。 ### 回答2: 在Vue中,拷贝响应数据可以使用`JSON.parse(JSON.stringify())`的方法。 Vue中的响应数据是通过Vue的响应系统进行管理的,当数据发生变化时,相关的视图会自动更新。然而,有时我们需要对响应数据进行拷贝,这可能是为了进行深层次的修改或者为了保留数据的原始状态等目的。 在拷贝响应数据时,直接使用常见的拷贝方法(如`Object.assign()`、`slice()`等)可能会导致新的对象失去响应功能,也就是说对新对象的修改不会触发相关视图的更新。 为了避免这个问题,我们可以使用`JSON.parse(JSON.stringify())`的方法来进行拷贝。该方法会将对象转换为字符串,然后再将字符串转换回对象,这样可以得到一个全新的对象,而且这个对象不再具有响应功能,但可以进行普通的数据操作。 示例代码如下: ```javascript var originalData = { name: '张三', age: 18 }; var copiedData = JSON.parse(JSON.stringify(originalData)); copiedData.name = '李四'; console.log(originalData); // 输出:{ name: '张三', age: 18 } console.log(copiedData); // 输出:{ name: '李四', age: 18 } ``` 需要注意的是,使用`JSON.parse(JSON.stringify())`进行拷贝时,只能处理简单的对象或数组,对于复杂的对象(例如包含函数、正则表达等),可能会出现意料之外的结果。因此,在进行拷贝操作时,需要谨慎选择合适的方法来保证数据的完整性和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值