Effective Java 读书笔记——第二章 创建和销毁对象

第6条:避免使用终结函数

终结函数(finalizer) 并不能保证会被及时的执行,时间关键的任务不应该由终结函数来完成。

Java中,当一个对象变的不可达的时候,垃圾回收器会回收与该对象相关联的储存空间,对于其他的非内存资源,一般用try-finally块来完成类似的工作。

如果一个类封装的资源确实需要回收,我们只需要提供一个显式的种植方法,并要求该类的客户在每个实例不再有用的时候终止这个方法。需要注意的是,该实例必须记录下自己是否已经被终止了:显式的种植方法必须在一个私有域中记录下“该对象已经不再有效了”,其他的方法必须检查这个域。

终结函数有两个合理的用途。

第一,当一个对象的所有者忘记了调用显式终止方法,终结函数可以充当”安全网“。

第二中合理的用途域对象的本地对等体有关。本地对等体是个本地对象,普通对象通过本地方法委托给一个本地对象,普通对象通过本地方法委托给一个本地对象。因为本地对等体不是一个普通对象,所以垃圾回收器不知道他,当他的普通对等体被回收的时候,他不会被回收。在本地对等体并不拥有关键资源的前提下,终结函数正是执行这项任务最合适的工具。

 值得注意的是,终结函数链并不会被自动执行。如果一个类有终结函数,并且子类改写了终结函数,那么自雷的终结函数必须要手动调用超类的终结函数。

 要防止子类没有调用超类的终结函数,只要为每一个将被终结的对象创建一个附加的对象,把终结函数放在一个匿名的类中,该匿名类的唯一用途时终结其外围实例。该匿名类的单个实例被称为终结函数守卫者。外围实例在他的私有实例域中保存着一个对其守卫者的唯一引用,所以终结函数守卫者与外围势力可以同时终结启动过程。当守卫者被终结的时候,他执行外围实例所期望的终结行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值