[英]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開始可以使用資源
從Closeable
或Autocloseable
繼承的任何內容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.