【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()来验证终结条件,将很难被发现这种缺陷。

posted @ 2013-11-08 15:59  薛遗山  阅读(3651)  评论(0编辑  收藏  举报