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

Java 9のCleanerクラスとは?finalize()の代替となる使い方を解説

プログラムの実行中に生成されたオブジェクトは、ガベージコレクタ(GC)によって自動的に削除されます。オブジェクトがどのスレッドからも参照されておらず、JVMがそのオブジェクトへアクセスできないと判断した場合、そのオブジェクトはガベージコレクションの対象となります。

Objectクラスにはfinalize()メソッドが用意されており、GCがヒープからオブジェクトを削除しようとする前に自動的に呼び出される仕組みでした。しかしJava 9では、このfinalize()メソッドは非推奨(deprecated)となり、代わりに新しいクラスjava.lang.ref.Cleanerがガベージコレクション管理のために追加されました。

Cleanerクラスのオブジェクトは、登録されたオブジェクトがガベージコレクションの対象になった時点で自動的に通知を受け取ります。監視対象のオブジェクトは、register()メソッドを使ってCleanerオブジェクトに登録する必要があります。

Cleanerクラスの主な特徴

  • Cleaner.create():Cleanerインスタンスを生成します
  • register(Object, Runnable):監視対象のオブジェクトと、クリーンアップ時に実行するアクション(Runnable)を登録します
  • オブジェクトが到達不可能になると、登録されたクリーンアップアクションが自動的に実行されます
  • クリーンアップアクション内では、監視対象のオブジェクトへの参照を保持しないよう注意が必要です(参照を保持するとオブジェクトが回収されなくなります)

コード例

import java.lang.ref.Cleaner;
public class CleanerTest {
    public static void main(String args[]) {
        System.out.println("TutorialsPoint");
        Cleaner cleaner = Cleaner.create();
        if(true) {
            CleanerTest myObject = new CleanerTest();
            cleaner.register(myObject, new State());   // Cleanerにオブジェクトを登録
        }
        for(int i = 1; i <= 10000; i++) {
            String[] largeObject = new String[1000];
            try {
                Thread.sleep(1);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    private static class State implements Runnable {
        public void run() {
            System.out.print("Cleaning action");
        }
    }
}

実行結果

TutorialsPoint
Cleaning action

解説

この例では、まずCleaner.create()でCleanerインスタンスを生成しています。ifブロック内で生成されたmyObjectは、ブロックを抜けた後どこからも参照されなくなるため、ガベージコレクションの対象となります。ループ処理で大量のオブジェクトを生成することでGCが発生しやすくなり、myObjectが回収されたタイミングで、登録しておいたStateクラスのrun()メソッドが実行され、「Cleaning action」が出力されます。

まとめ

Java 9以降では、finalize()メソッドの代わりにCleanerクラスを使用することが推奨されています。Cleanerを利用することで、オブジェクトの解放タイミングに合わせた後処理(リソースのクローズや一時ファイルの削除など)を、より安全かつ柔軟に実装できます。

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

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

  2. JavaのContainerクラスとは?重要性と使い方を実例つきで解説

    JavaのGUIプログラミングにおいて、Containerクラスは画面を構成する部品を整理・管理するための土台となる存在です。この記事では、Containerクラスの役割、種類ごとの特徴、そして実際のコード例を通じて、その重要性をわかりやすく解説します。 Containerクラスとは Containerクラスは、複数のコンポーネント(ボタンやテキストフィールドなど)をひとまとめにして保持できる特殊なコンポーネントです。UIを構築する際の「入れ物」として機能し、レイアウト管理においても重要な役割を担います。 Containerクラスは、複数のコンポーネントの集まりを保持できる特殊なコンポー