软件构造学习小记(五)防御性复制


前言

防御性复制是十分有用的一个思想。


一、为什么需要防御性复制

用户可能毁坏不变性(可能是有意的,也可能是无意的)。
确保类不变量在任何输入下都有效,以最小化可变性。

二、如何使用防御性复制

下面以一个例子介绍如何使用防御性复制。

1.源程序

代码如下:

public class A {
 
	private Date b;
 
	public A(Date b) {
		this.b = b;
	}
 
	public Date getb() {
		return b;
	}
 

如果我们进行如下操作:

	public static void main(String[] args) {
 
		A p = new A(new Date(2002, 1, 1));
		System.out.println(p.getb().getYear());
		
		Date c = p.getb();
		c.setYear(2022);
		
		System.out.println(p.getb().getYear());
	}

我们会发现输出如下:

2002
2022

这是由于Date类是可变的。
对于类似于Date的这种可变类,对其进行引用时都有可能发生修改。

2.修改后的代码

对于上述代码,我们的修改方法就是使用防御性复制。

public class A {
 
	private Date b;
 
	public A(Date b) {
		this.b = b;
	}
 
	public Date getb() {
		return new Date(b.toString());		//防御性复制
	}
}

总结

如果类具有从客户端得到或者返回到客户端的可变对象,类就必须防御性的复制这些对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值