1. 程式人生 > >關於finalize()方法(總結)

關於finalize()方法(總結)

finalize()是在java.lang.Object裡定義的,也就是說每一個物件都有這麼個方法。這個方法在gc啟動,該物件被回收的時候被呼叫。其實gc可以回收大部分的物件(凡是new出來的物件,gc都能搞定,一般情況下我們又不會用new以外的方式去建立物件),所以一般是不需要程式設計師去實現finalize的。
特殊情況下,需要程式設計師實現finalize,當物件被回收的時候釋放一些資源,比如:一個socket連結,在物件初始化時建立,整個生命週期內有效,那麼就需要實現finalize,關閉這個連結。
使用finalize還需要注意一個事,呼叫super.finalize();

一個物件的finalize()方法只會被呼叫一次,而且finalize()被呼叫不意味著gc會立即回收該物件,所以有可能呼叫finalize()後,該物件又不需要被回收了,然後到了真正要被回收的時候,因為前面呼叫過一次,所以不會呼叫finalize(),產生問題。
所以,推薦不要使用finalize()方法,它跟解構函式不一樣。

1.object定義
protected void finalize() //定義為子類可見

2.執行時機不可預知
當一個物件變得不可觸及時,垃圾回收器某個時期會回收此物件。
當回收物件之前會呼叫finalize方法,這類似於人類臨終之前必須做一件事情:寫遺言。
因為GC是不確定性的(這跟JVM相關),所以finalize方法的執行具有不可預知性。

3.finalize忽略異常
即finalize程式碼中若出現異常,異常會被忽略

4.finalize使用
什麼時候使用?一般來說,finalize被作為第二種安全網來使用,如FileInputStream類,
當物件回收時,有可能資源為釋放,所以這裡第二次來確認(那也總比不釋放強吧,雖然具體釋放時機未定)

protected void finalize() throws IOException { 
    if (fd != null) { 
        if (fd != fd.in) { 
            close(); 
        } 
    } 
} 

注意:某些用到finalize的地方,你必須像如下所示,顯式呼叫回收鏈。

protected void finalize() throws IOException { 
    try{ 
                              ... 
    }finally{ 
            super.finalize(); 
    } 
} 

5.<\effective java>建議:儘量不要使用finalize,除非以它作為安全網,或是為了終結非關鍵的原生資源。