【Java之對象清理】finalize()的用途


Java允許在類中定義一個名為finalize()的方法。它的工作原理是:一旦垃圾回收器准備好釋放對象占用的存儲空間,將首先調用其finalize()方法。並且在下一次垃圾回收動作發生時,才會真正回收對象占用的內存。

關於垃圾回收,有三點需要記住:

  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方法中,由於程序錯誤,有一本書未被簽入。要是沒有finalize()來驗證終結條件,將很難被發現這種缺陷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM