Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのfinalize()メソッドをオーバーライドする目的とは?

finalize()メソッドは、Objectクラスにあらかじめ定義されているprotectedなメソッドです。このメソッドをオーバーライドする主な目的は、オブジェクトがガベージコレクション(GC)によって回収される前に、クリーンアップ処理(後始末のコード)を実行したり、ファイルハンドルやネットワーク接続などのシステムリソースを解放したりすることにあります。

finalize()メソッドをオーバーライドする場合、その呼び出しはプログラマ自身の責任となります。必要に応じて明示的に呼び出す必要があります。また、finalize()メソッドは、JVMによって任意のオブジェクトに対して一度しか呼び出されないという特徴があります。

構文

protected void finalize() throws Throwable

サンプルコード

public class FinalizeMethodTest {
   protected void finalize() throws Throwable {
      try {
         System.out.println("FinalizeMethodTestクラスのfinalize()メソッドを呼び出しています");
      } catch(Throwable th) {
         throw th;
      } finally {
         System.out.println("Objectクラスのfinalize()メソッドを呼び出しています");
          super.finalize();
      }
   }
   public static void main(String[] args) throws Throwable {
      FinalizeMethodTest test = new FinalizeMethodTest();
      String str = "Javaにおけるfinalize()メソッド";
      str = null;
      System.out.println(str);
      test.finalize();
   }
}

実行結果

null
FinalizeMethodTestクラスのfinalize()メソッドを呼び出しています
Objectクラスのfinalize()メソッドを呼び出しています

コードのポイント

この例では、オーバーライドしたfinalize()メソッド内でtry-catch-finallyブロックを使用しています。finallyブロック内でsuper.finalize()を呼び出すことで、親クラスであるObjectクラスのfinalize()処理も確実に実行されるようにしています。これは、オーバーライド時に推奨される作法です。

注意点:Java 9以降での非推奨化

finalize()メソッドはJava 9以降で非推奨(deprecated)となっており、将来的に削除される予定です。理由としては、実行タイミングがJVMに依存して予測できないこと、パフォーマンスへの悪影響、リソースリークの原因になりうる点などが挙げられます。

現在のJava開発では、代わりに以下の手法を使うことが推奨されています。

  • try-with-resources文:AutoCloseableインターフェースを実装したリソースを確実にクローズできる
  • java.lang.ref.Cleaner:Java 9で導入された、より安全なクリーンアップ機構
  • PhantomReference:オブジェクトの回収可能性を柔軟に扱える参照クラス

新規のコードを書く際は、finalize()に頼らず上記の代替手段を採用するのが良いでしょう。

  1. JavaのString intern()メソッドとは?その役割と使い方をわかりやすく解説

    JavaにおけるStringクラスの基本Stringは、Javaで一連の文字(文字列)を格納するためのクラスで、java.langパッケージに属しています。Stringオブジェクトは一度生成すると内容を変更できない「イミュータブル(不変)」という特性を持っています。文字列の保存場所すべてのStringオブジェクトは、ヒープ領域内にある「文字列定数プール(String Constant Pool)」と呼ばれる専用のメモリ領域に格納されます。文字列リテラルを定義するたびに、JVMは文字列定数プール内にその値を持つStringオブジェクトを生成します。そのため、同じ内容の文字列リテラルが複数存在して

  2. JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説

    JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ