私はfinalize()メソッドを持つ入れ子式のコンストラクタを持つスーパークラスを持っています。 super.finalizeを呼び出すのを忘れるサブクラスから保護するために、私はfinalizerガーディアン(EJ Item 7)を書いています。ここで Javaファイナライザーガーディアンが動作していないようですか?
public class Super {
public Super() {}
{
Object finalizerGuardian = new Object() {
@Override
protected void finalize() {
System.out.println("Finalizer guardian finalize");
Super.this.finalize();
}
};
}
protected void finalize() {
System.out.println("Super finalize");
}
}
はサンプルサブクラスである -
public class Sub extends Super {
public Sub() {}
protected void finalize() {
System.out.println("Sub finalize");
}
public static void main(String[] args)
throws InterruptedException {
if (1 == 1) {
Sub s1 = new Sub();
}
Runtime.getRuntime().gc();
Thread.sleep(10000);
}
}
S1オブジェクトがスコープの外に出る
は、ファイナライザ保護者のファイナライズ()が呼び出されます、と私は、サブクラスのfinalizeメソッドからSYSOを取得し、スーパーのファイナライズから決して1つを得ることはありません。私は混乱しています。基本的に何かを誤解していますか?
免責事項:ファイナライザは危険であり、推奨できないことなどを認識しています。ここでも問題を理解しようとしています。
明白な問題を見るためには、「動作しません」ということに巻き込まれすぎています。ありがとう!! – Kal