避免使用终结方法和清除方法

避免使用终结方法和清除方法

使用终结方法的缺点

首先应该清楚的是,终结方法(finalize())不等同于 C++ 中等析构方法。

这类方法不能保证其会被及时执行,甚至不能保证会被执行,因此,不应该依赖终结方法或者清除方法来更新重要的持久状态。

终结方法内部如果产生了未被捕获的异常,则终结方法也会异常终止,而且,不会打印异常警告。

使用终结方法会产生非常严重的性能损失。主要是因为终结方法阻止了有效的垃圾回收。

终结方法也存在安全问题。可以通过反序列化的对象抛出异常,使得恶意子类的终结方法中构造了一部分的对象上运行,将该对象引用记录到静态域中,防止被垃圾回收器回收。因此对于非 final 类,要编写一个空的 final 的 finalize 方法,以防止收到终结方法的攻击。

使用终结方法的优点

第一种用途是,当资源的所有者忘记调研其 close 方法时,可以使用终结方法或清除方法来充当 “安全网”,即最后一道防线。

第二种用途与对象的本地对等体有关。本地对等体是非 Java 的本地对象,通过本地方法(native),普通对象可以委托给本地对象。因为本地对象不受垃圾回收器的管控,因此,可以在终结方法或者清除方法中,完成对本地对象资源的管理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值