2012-07-07 1 views
7

サブクラスがガベージコレクションされているときに、親クラスのfinalize()が呼び出されることが保証されていない(どこか)ことを読んだ場合、ほとんどの開発者がサブクラスでfinalize()をオーバーライドし、super.finalize()を呼び出しますか?サブクラス内でsuper.finalize()を呼び出しますか?

+6

効果的なJava項目7:ファイナライザを避ける。ファイナライザを使用する場合は、super.finalize()を呼び出す必要があります。 – assylias

+0

サブクラスがガベージコレクトされると、スーパークラスに対してfinalize()が呼び出されますか? – user997112

+3

私は、関連性があると思う偉大な記事:[Finalizeが保護されている理由](http://www.0xcafefeed.com/2005/09/why-is-finalize-method-protected/) –

答えて

13

スーパークラスに対してFinalizeは自動的に呼び出されません。あなたはファイナライズを上書きするのであれば、「スーパークラスを確保するための適切な方法は、

protected void finalize() { 
    try { 
     // do subclass cleanup 
    } 
    finally { 
     super.finalize(); 
    } 
} 

それはファイナライザは非常に予測できないことに注意する必要がありますhttp://www.ibm.com/developerworks/java/library/j-jtp06294/index.html

このリファレンスの記事を参照してくださいだろうクリーンアップされますと、あなたはドン実行するかどうかを制御できます。ファイナライズの方法で重要なことはありません。一般的に、クラスの明示的なクリーンアップを実行する方が良い方法です。

3

Java以外のリソースのクリーンナップにファイナライズすることを避けるのが最善です(ファイアウォールは保証されません)。可能であれば、リソースでtry(JDK7を使用している場合)を使用するか、可能であれば他のオプションの間でリソースをクリーンアップするためにfinally節を試してください。 finalizeを使用する場合は、try. finallyブロックにsuper.finalizeを入れることができます。リソースをクリーンアップするためにファイナライズに頼るのは賢明でしょう。

// don't make it public! 
protected void finalize() throws Throwable 
{ 
    try 
    { 
    // custom finalization here 
    } 
    finally 
    { 
    super.finalize(); 
    } 
} 

アイデアがリソースをクリーンアップしている場合、おそらくファントム参照をチェックアウトするのが賢明だろう - それはどちらも強く/弱く/そっと到達可能である場合、オブジェクトは、想像線到達可能である、&をファイナライズされているであります少なくとも1つのファントム参照(すなわち、オブジェクトはファイナライズされていますが、まだ再生されていません)。

関連する問題