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