HOWTO · Java

Java の弱い参照クラス

このチュートリアルでは、Java の弱い参照クラスについて説明します。

このページの内容

弱い参照とは、オブジェクトをメモリに残しておくのに十分な強度ではない参照です。このチュートリアルでは、Java での弱い参照の使用について説明します。

Java の弱い参照クラス

Java では、java.lang.ref.WeakReference クラスがガベージコレクターを利用して到達可能性を判断するため、自分で行う必要はありません。Java の weakreference クラスには、次のメソッドがあります。

方法 説明
get() このメソッドは、参照オブジェクトの参照を返します。
clear() このメソッドは、参照オブジェクトをクリアするために使用されます。
enqueue() このメソッドは、参照オブジェクトをキューに追加するために使用されます。オブジェクトをキューに登録する必要があります。
isEnqueued() このメソッドは、参照オブジェクトがキューに入れられているかどうかを通知します。ガベージコレクターまたはプログラム自体による可能性があります。

まず、Java の弱い参照クラスを実装する簡単な例を試してみましょう。

package delftstack;

import java.lang.ref.WeakReference;
public class Weak_Reference {
  public static void main(String[] args) {
    // creating a strong object
    Demo_Class Strong_Object = new Demo_Class();

    // creating a weak reference of demo_class
    WeakReference<Demo_Class> Weak_Object = new WeakReference<>(Strong_Object);
    System.out.println("Call the show info function using  the strong object");
    Strong_Object.Show_Info();

    System.out.println("Setting the object to null");
    Strong_Object = null;
    Strong_Object = Weak_Object.get();

    System.out.println("Call the show info function using  the weak object");
    Strong_Object.Show_Info();
  }
}
class Demo_Class {
  void Show_Info() {
    System.out.println(">>This is the info from demo class<<");
  }
}

上記のコードは、Demo_Class の強いオブジェクトと同じクラスの弱いオブジェクトを作成し、Show_Info 関数を呼び出します。出力を参照してください:

Call the show info function using  the strong object
>>This is the info from demo class<<
Setting the object to null
Call the show info function using  the weak object
>>This is the info from demo class<<

次に、上記の方法で例を試してみましょう。

package delftstack;

import java.lang.ref.WeakReference;
public class Weak_Reference {
  public static void main(String[] args) {
    Demo_Class Strong_Object = new Demo_Class();
    WeakReference<Demo_Class> Weak_Object = new WeakReference<Demo_Class>(Strong_Object);

    System.out.println("Retrieve object from weak reference using get()");
    Weak_Object.get().Show_Info();

    System.out.println("queue object using enqueue()");
    System.out.println(Weak_Object.enqueue());

    System.out.println("Check if reference is queued using isEnqueued()");
    System.out.println(Weak_Object.isEnqueued());
  }
}
class Demo_Class {
  void Show_Info() {
    System.out.println("Show_Info() from Demo_Class is called.");
  }
}

上記のコードは、Demo_Class の弱いオブジェクトで上記のすべてのメソッドを使用します。出力を参照してください:

Retrieve object from weak reference using get()
Show_Info() from Demo_Class is called.
queue object using enqueue()
false
Check if reference is queued using isEnqueued()
false