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