终结函数守卫者

本文介绍了一种称为终结函数守卫者模式的技术,用于确保非final公有类中的资源得到正确释放。通过创建匿名内部类来替代直接重写finalize()方法,避免了因子类忘记调用super.finalize()而导致的资源泄露问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.引入:之所以要使用这项技术是因为一个非final的公有类覆盖了来自Object的finalize()方法,此类被继承时在子类中如果同样的重写了finalize()方法时需要使用如下模式调用父类被覆盖的finalize()方法。

 

protected void finalize() throws Throwable {
		try{
			//do something for finalize
		}finally{
			super.finalize();
		}
	}

 

如果子类中忘记调用,则父类中资源将不能得到释放。(父类)要防范这种错误需要采用终结函数守卫者对象对其资源进行释放。

2.使用

为每一个将被终结的对象(非final公有类中有符合使用原本需继承Object中finalize()方法来释放资源的)创建一个附加的对象。不是把终结函数放在要求终结处理的类中,而是把终结函数放在一个匿名的内部类中,该匿名内部类唯一的用途是终结其外围实例。该匿名类的单个实例被称为终结函数守卫者,外围类的每一个实例都会创建这样的一个守卫者对象。外围实例在它的私有域中保存着一个对其守卫者的唯一引用,所以,终结函数守卫者与外围实例可以同时启动终结过程。当守卫者被终结的时候,它执行外围实例所期望的终结行为,就好像它的终结函数是外围对象上的一个方法一样。

 

public class Super {

	private final Object finalizeGuardian = new Object(){
		protected void finalize() throws Throwable {
			//do something for finalize Super object
		}
	};

 注意:公有类Super没有终结函数,所以其子类的终结函数是否调用super.finalize()并不重要,对于每一个带有终结函数的非final公有类,都应该考虑使用这项技术来取缔终结函数。

 

 注意:以上技术的使用是在可以使用finalize()来作为终结方法来使用的唯一两种情况下采用的替代技术,即:

1)作为完全网。(提供了释放资源的显示释放方法,但是防止忘记调用)

2)为了终止非关键的本地资源。(普通对象的本地对等体并不拥有关键资源的前提下)

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值