7

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

4

2 に答える 2

14

スーパークラスに対してFinalizeが自動的に呼び出されることはありません。したがって、finalizeをオーバーライドする場合、スーパークラスがクリーンアップされるようにする適切な方法は次のようになります。

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

この参照記事を参照してくださいhttp://www.ibm.com/developerworks/java/library/j-jtp06294/index.html

ファイナライザーはあまり予測可能ではなく、実行するかどうか/いつ実行するかを制御できないことに注意してください。ファイナライズメソッドでは、重要なことは何も実行しないでください。一般に、クラスの明示的なクリーンアップを実行することをお勧めします。

于 2012-07-07T22:31:28.750 に答える
3

Java以外のリソースをクリーンアップするためにfinalizeに依存することを避けるのが最善です(finalize呼び出しは保証されません)。可能であれば、try with resources(JDK7を使用している場合)を使用するか、finally句を使用して、可能な場合は他のオプションの中でリソースをクリーンアップします。finalizeを使用する場合は、super.finalizeをtryfinallyブロックに入れることができます。リソースをクリーンアップするためにファイナライズに依存しないのが賢明です。

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

リソースをクリーンアップするというアイデアの場合は、ファントム参照を確認することをお勧めします。オブジェクトが強く/弱く/ソフトに到達可能でなく、ファイナライズされていて、少なくとも1つのファントム参照(つまりオブジェクト)がある場合、オブジェクトはファントム到達可能です。確定しましたが、まだ回収されていません)。

于 2012-07-07T22:33:23.093 に答える