【Javaのオブジェクトクリーンアップ】finalize()の用途

1258 ワード

Javaでは、クラスにfinalize()というメソッドを定義できます.ごみ回収器がオブジェクトが占有するストレージスペースを解放する準備ができたら、まずfinalize()メソッドを呼び出すのが原理です.また、次のゴミ回収動作が発生すると、オブジェクトが使用するメモリが本当に回収されます.
ごみの回収について、3つ覚えておく必要があります.
1、対象はゴミ回収されない場合があります.プログラムがストレージスペースの使い切りに瀕していない限り、オブジェクトが占有するスペースは解放されません.
2、ゴミ回収は「構造分析」に等しくない.
3、ゴミ回収はメモリのみに関係する.ごみ回収を使用する唯一の理由は、プログラムが使用しなくなったメモリを回収するためです.
finalize()の用途:
オブジェクトがどのように作成されても、ゴミ回収器はオブジェクトが占有するすべてのメモリを解放します.これにより、finalize()に対する需要は、あるオブジェクトの作成方式以外の方法でオブジェクトに記憶空間を割り当てた特別な状況に制限される.しかし、この場合、「ローカルメソッド」を使用する場合、ローカルメソッドはJavaではないJavaコードを呼び出す方法です.
finalize()メソッドには、オブジェクトの終了条件の検証という興味深い使い方があります.簡単に言えばfinalize()を呼び出すことで、いくつかの暗い欠陥を発見することです.例:
  
class Book{

	boolean checkedOut = false;

	Book(boolean checkOut){

		checkedOut = checkOut;

	}

	void checkIn(){

		checkedOut = false;

	}

	protected void finalize(){

		if (checkedOut){

			System.out.println("Error: checked out ");

		}

	}

}

public class TerminationCondition {

	public static void main(String[] args){

		Book novel = new Book(true);

		novel.checkIn();

		new Book(true);

		System.gc();

	}

}


本例の終了条件は,すべてのBookオブジェクトがゴミ回収として扱われる前にチェックインされるべきである.しかしmainメソッドでは、プログラムエラーのため、1冊の本がチェックインされていません.finalize()が終端条件を検証しなければ,この欠陥は発見されにくい.