2017-05-04 40 views
8

今天我在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() {} 
} 
+1

https://kotlinlang.org/docs/reference/java- interop.html#敲定 – ean5533

+0

@ ean5533呃我沒有完整閱讀那個長的互文檔,現在是我的懲罰。不管怎樣,謝謝你。 – glee8e

+0

你讀過「[finalize()調用Java 8中強烈可達的對象](https://stackoverflow.com/q/26642153/2711488)」嗎?底線是,你最好不要那樣做。除非你的代碼涉及直接處理系統資源的'native'代碼,否則你的類將是實際上代表資源的另一個對象的包裝,並且讓包裝的可達性決定實際資源的生存時間(這仍然是可達的,並且在使用),意味着要求嚴重的問題... – Holger

回答

12

official documentation涵蓋這一點。

要覆蓋的finalize(),所有你需要做的僅僅是把它聲明,不使用override關鍵字:

class C { 
    protected fun finalize() { 
     // finalization logic 
    } 
} 
+0

秒打我:) – ean5533

+0

謝謝!這就是我需要的!但爲什麼stackoverflow禁止在12分鐘前粘貼選擇anwser ... – glee8e