三、保护用户免于内存保留问题
前一节描述了在用使用终结器的第三方类工作时怎样避免内存保留问题。本节将描述怎样创建需要最后清理的类,这样以来它们的用户就不会遇到前面所概括的问题。为此,最好的方法是把这样的类分解为两个(一个持有需要最后清理的数据,另一个持有其它一切)并且只在前者上定义一个终结器。下面的代码展示了这一技术:
final class NativeImage2 {
private int nativeImg;//指向本地图像数据
//它释放本地图像;随后对它的调用将被忽略
private native void disposeNative();
void dispose() { disposeNative(); }
protected void finalize() { dispose(); }
}
public class Image2 {
private NativeImage2 nativeImg;
private Point pos;
private Dimension dim;
public void dispose() { nativeImg.dispose(); }
}

图5.当Image2实例成为不可达时,只有NativeImage2实例将会排队
一处微妙的地方在于,NativeImage2不应该成为一个Image2的内部类。内部类的实例都有一个到创建它们的外部类的实例的隐含参考。所以,如果NativeImage2是Image2的一个内部类,并且一个NativeImage2实例在排队等待最终化,它应该保留相应的Image2实例,这恰恰是前面你尽力想避免的。然而,假定NativeImage2类只能从Image2类中进行存取。这就是为什么它没有公共方法的原因(它的dispose()方法,以及类本身都是为包所私有的)。
