避免使用终结方法和清除方法
使用终结方法的缺点
首先应该清楚的是,终结方法(finalize())不等同于 C++ 中等析构方法。
这类方法不能保证其会被及时执行,甚至不能保证会被执行,因此,不应该依赖终结方法或者清除方法来更新重要的持久状态。
终结方法内部如果产生了未被捕获的异常,则终结方法也会异常终止,而且,不会打印异常警告。
使用终结方法会产生非常严重的性能损失。主要是因为终结方法阻止了有效的垃圾回收。
终结方法也存在安全问题。可以通过反序列化的对象抛出异常,使得恶意子类的终结方法中构造了一部分的对象上运行,将该对象引用记录到静态域中,防止被垃圾回收器回收。因此对于非 final 类,要编写一个空的 final 的 finalize 方法,以防止收到终结方法的攻击。
使用终结方法的优点
第一种用途是,当资源的所有者忘记调研其 close 方法时,可以使用终结方法或清除方法来充当 “安全网”,即最后一道防线。
第二种用途与对象的本地对等体有关。本地对等体是非 Java 的本地对象,通过本地方法(native),普通对象可以委托给本地对象。因为本地对象不受垃圾回收器的管控,因此,可以在终结方法或者清除方法中,完成对本地对象资源的管理。