今天我在kotlin中實現了一個Closeable
,正如我以前在java中完成的一樣,我想實現finalize()
作爲最後的手段回退,以防客戶端代碼忘記關閉它,使關鍵資源未被回收。我認爲這個資源非常重要,可以增加這個後備,儘管這個後備不可靠。但是,kotlin.Any
沒有聲明finalize
方法,這意味着我不能simplydo此:如何在kotlin中實現finalize()?
class Resource: Closeable {
fun close() {}
override fun finalize() { close()}
}
這是不好的,至少不會好,因爲它應該是。現在我回到普通的Java作爲解決方法。有誰知道如何在純Kotlin中做到這一點?
PS:我目前的解決方法:
FinalizedCloseable.java:
public abstract class FinalizedCloseable implement Closeable {
@Override protected void finalize() { close(); }
}
科特林:
class Resource: FinalizedCloseable(), Closeable {
fun close() {}
override fun finalize() { close()}
}
但這種解決方法需要一個超類。如果下一次我的其他Resource
已經有超類,這種解決方法將不會工作沒有大量的樣板。
編輯:現在我知道如何實現的finalize(),但IDEA科特林插件是不是足夠聰明,知道這是一個終結,並因此與一定的警示標記它。掙扎了一會兒後,我發現如何抑制這些警告,我要分享:
class C {
@Suppress("ProtectedInFinal", "Unused") protected fun finalize() {}
}
https://kotlinlang.org/docs/reference/java- interop.html#敲定 – ean5533
@ ean5533呃我沒有完整閱讀那個長的互文檔,現在是我的懲罰。不管怎樣,謝謝你。 – glee8e
你讀過「[finalize()調用Java 8中強烈可達的對象](https://stackoverflow.com/q/26642153/2711488)」嗎?底線是,你最好不要那樣做。除非你的代碼涉及直接處理系統資源的'native'代碼,否則你的類將是實際上代表資源的另一個對象的包裝,並且讓包裝的可達性決定實際資源的生存時間(這仍然是可達的,並且在使用),意味着要求嚴重的問題... – Holger