Java でオブジェクトを削除する
 
Java でオブジェクトを削除する方法と、ガベージコレクタを利用する方法を以下の例で学びます。
Java Object を null を参照して削除する
    
Java オブジェクトを削除する最初の例では、変数 name と age を初期化するコンストラクタを持つクラスを作成します。main メソッドでは、User クラスの object を作成し、name と age の値を渡します。オブジェクトが初期化されたので、これを使って age を取得し、それを比較してメッセージを表示することができます。しかし、その後は myObject を削除してそれ以上使えないようにしたい。
そのためには、もう一度 myObject を null で初期化します。一度 myObject が null になってしまうと、それを使ってそのメソッドや変数を呼び出すことはできず、例外が発生します。System.gc() は、メモリを解放するために空のフィールドやオブジェクトが残らないように、残ったゴミを回収するために使われます。
User クラスに finalize() メソッドがあることがわかります。これは、ガベージを収集する前にオブジェクト上で呼び出されます。
public class JavaDeleteObject {
  public static void main(String[] args) {
    User myObject = new User("John", 30);
    int userAge = myObject.age;
    if (userAge > 25) {
      System.out.println("User age is : " + userAge);
    } else {
      System.out.println("User age is less than 25 : " + userAge);
    }
    myObject = null;
    System.gc();
    System.out.println(myObject.age);
  }
}
class User {
  String name;
  int age;
  User(String n, int a) {
    name = n;
    age = a;
  }
  protected void finalize() {
    System.out.println("Object is garbage collected.");
  }
}
出力:
User age is : 30
Object is garbage collected.
Exception in thread "main" java.lang.NullPointerException
	at com.company.JavaDeleteObject.main(JavaDeleteObject.java:18)
Java はスコープに閉じ込められたオブジェクトを null を参照して削除する
以下のコードでは、3つのデータメンバを持つ Student クラスがあり、これらのメンバにはクラスのパラメータ化されたコンストラクタを用いて値が代入されます。このクラスには showDetails() メソッドと showNextIndex() メソッドがあります。また、次の学生のインデックスを表示する finalize() メソッドもあります。
新しいオブジェクトは Student クラスの new キーワードを用いて作成されます。Student クラスのメソッドは student1 と student2 オブジェクトに対して呼び出されます。コードの後半では、スコープ内にさらに多くの Student クラスオブジェクトを作成しています。これらを使用した後、System.gc() を呼び出し、このスコープ内に作成した 2つのオブジェクトをガベージコレクションするように JVM に要求します。
スコープに入る前に nextIndex の値を 3 にインクリメントし、スコープを抜ける前には 5 にします。値 nextIndex をデクリメントするには、オブジェクトがガベージコレクションされる前に System.runFinalization() を使って finalize() メソッドを 2 回呼び出し、値 5 を指定します。
その後、スコープ内にあった値を除いた正しい nextIndex 値が表示されます。
class Student {
  private int index;
  private String name;
  private int age;
  private static int nextIndex = 1;
  Student(String name, int age) {
    this.name = name;
    this.age = age;
    this.index = nextIndex++;
  }
  public void showDetails() {
    System.out.println("Student at Index : " + index + ", Student name: " + name + ", age: " + age);
  }
  public void showNextIndex() {
    System.out.println("Next Index: " + nextIndex);
  }
  protected void finalize() {
    --nextIndex;
  }
}
class UseStudent {
  public static void main(String[] args) {
    Student student1 = new Student("John", 23);
    Student student2 = new Student("Doe", 20);
    student1.showDetails();
    student2.showDetails();
    student1.showNextIndex();
    student2.showNextIndex();
    {
      Student student3 = new Student("Sam", 22);
      Student student4 = new Student("Ben", 21);
      student3.showDetails();
      student4.showDetails();
      student3.showNextIndex();
      student4.showNextIndex();
      student3 = student4 = null;
      System.gc();
      System.runFinalization();
    }
    student2.showNextIndex();
  }
}
出力:
Student at Index : 1, Student name: John, age: 23
Student at Index : 2, Student name: Doe, age: 20
Next Index: 3
Next Index: 3
Student at Index : 3, Student name: Sam, age: 22
Student at Index : 4, Student name: Ben, age: 21
Next Index: 5
Next Index: 5
Next Index: 3
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn