`
mazhongjia
  • 浏览: 25390 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

终结函数守卫者

 
阅读更多

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)为了终止非关键的本地资源。(普通对象的本地对等体并不拥有关键资源的前提下)

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics