簡體   English   中英

您如何用Java編寫解構函數?

[英]How do you write a deconstructor in Java?

我遇到了這個問題,正在尋找一些想法?

您不需要(也不應該嘗試使用)析構函數-或在Java中稱為“終結器”的析構函數。

VM規范確實允許VM實現永遠不調用它們。 因此,它們對於資源釋放等不可靠。 一般來說,在對象被垃圾回收之前,VM可以調用任何對象的finalize()方法中的代碼,但是由於這不是強制性的,因此應避免使用它。

Java是垃圾回收的,因此無法確定何時調用析構函數 (何時將對象垃圾回收)。

有一個finalize (繼承)方法,但由於上面的確切原因,您不能依賴該方法(您無法預測何時以及是否將調用它)。

如果只需要清理一些資源,則可以調用Runtime.getRuntime()。addShutdownHook

Java中的自動對象“銷毀”從未在保證的時間發生。 唯一的垃圾回收受權者是,在收集對象之前,將調用finalizer方法。 當然,垃圾收集器永遠不能保證運行,或者在運行時不做任何事情。 因此,不能保證將調用finalize方法。

如果要在Java中模擬C ++析構函數,最好的方法是使用以下習慣用法(涉及異常處理時會有所不同-我將在這里展示最簡單的情況):

final Resource r;

r = new Resource();

try
{
    r.use();
}
finally
{
    r.cleanup();
}

其中“清理”方法是“析構函數”。

這更像是C ++資源獲取是初始化的慣用法 ,它確實適用於基於堆棧的對象,但效果並不理想。

您可以檢查此信息以獲取有關終結的更多信息-finalize ()方法

由於其他人在談論正常情況。.在某些特殊情況下,您想創建destroy()destruct()releaseExternalResources()shutdown()等方法,這些方法應由控制生命周期的實體主動調用 。該實例。

例如,一個對象可以是其中包含活動線程的ActiveObject。 在這種情況下,您想將其關閉,否則會發生內存泄漏。

雖然可能不會稱其為析構函數...

在一個旁注中,我想面試問題是一個技巧問題!

從Java 1.7開始可以使用資源

CloseableAutocloseable繼承的任何內容Autocloseable可以使用它。

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

try (FileReader br = new FileReader(path)) {
    return br.readLine();
}

這將自動調用一個close函數,該函數一定要在代碼塊的末尾被調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM