finalize() 方法

這是 Object 類的受保護非靜態方法。此方法用於在物件從記憶體中刪除之前對物件執行某些最終操作或清理操作。

根據文件,當垃圾收集確定沒有對該物件的更多引用時,該方法由物件上的垃圾收集器呼叫。

但是,如果物件仍然可以訪問,或者當物件符合條件時沒有執行垃圾收集器,則無法保證呼叫 finalize() 方法。這就是為什麼最好不要依賴這種方法。

在 Java 核心庫中可以找到一些用法示例,例如在 FileInputStream.java 中:

protected void finalize() throws IOException {
    if ((fd != null) &&  (fd != FileDescriptor.in)) {
        /* if fd is shared, the references in FileDescriptor
         * will ensure that finalizer is only called when
         * safe to do so. All references using the fd have
         * become unreachable. We can call close()
         */
        close();
    }
}

在這種情況下,如果該資源之前尚未關閉,則它是關閉資源的最後機會。

一般來說,在任何型別的應用中使用 finalize() 方法都是不好的做法,應該避免使用。

終結器不是用於釋放資源(例如,關閉檔案)。當(如果!)系統在堆空間上執行不足時,將呼叫垃圾收集器。當系統在檔案控制代碼上執行不足或由於任何其他原因,你不能依賴它來呼叫它。

終結器的預期用例是針對即將被回收的物件,以通知其他物件即將發生的厄運。現在為此目的存在一種更好的機制 - java.lang.ref.WeakReference<T> 類。如果你認為需要編寫 finalize() 方法,那麼你應該考慮是否可以使用 WeakReference 來解決相同的問題。如果這不能解決你的問題,那麼你可能需要在更深層次上重新考慮你的設計。

進一步閱讀這裡大約是從由 Joshua 布洛赫“有效的 Java”的書 finalize() 方法的專案。