2017-05-04 54 views
8

今日、私はkotlinにCloseableを実装しています。過去にJavaで行ったように、クライアントコードが閉じることを忘れた場合の最後の手段として、finalize()を実装したいと思います。 。私は、このフォールバックの信頼性が低いにもかかわらず、この代替リソースを追加するにはこのリソースを十分に批判的だと考えます。kotlinでfinalize()を実装する方法は?

class Resource: Closeable { 
    fun close() {} 
    override fun finalize() { close()} 
} 

これは、それがあるべきと少なくとも同じ良くない、良いではありません。しかし、kotlin.Anyは、私はこれをsimplydoできないことを意味finalize方法を、宣言していません。これで回避策としてJavaに戻すことができます。純粋なKotlinでこれを行う方法を誰かが知っていますか?

PS:私の現在の回避策:

FinalizedCloseable.java:

public abstract class FinalizedCloseable implement Closeable { 
    @Override protected void finalize() { close(); } 
} 

Kotlin:

class Resource: FinalizedCloseable(), Closeable { 
    fun close() {} 
    override fun finalize() { close()} 
} 

しかし、この問題を回避するには、スーパークラスが必要です。次に他のResourceに既にスーパークラスがある場合、この回避策は多くの定型文なしでは機能しません。


編集:今私は)(ファイナライズを実装する方法を知っているが、IDEA kotlinプラグインは、これは、ファイナライザであり、したがって、いくつかの警告とそれをマークしていることを知っているのに十分にスマートではありません。しばらく苦労した後、私はこれらの警告を抑止する方法を見つけて、私はそれを共有したい:

class C { 
    @Suppress("ProtectedInFinal", "Unused") protected fun finalize() {} 
} 
+1

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

+0

@ ean5533私はその長い相互運用性の文書を完全には読まなかったので、今は私の罰です。とにかくありがとうございました。 – glee8e

+0

「[Java 8で強く到達可能なオブジェクトで呼び出された(finalize()](https://stackoverflow.com/q/26642153/2711488)」を読んだことがありますか?結論は、あなたはそれを全くしない方がいいでしょう。あなたのコードがシステムリソースを直接扱う 'ネイティブ'コードを必要としない限り、あなたのクラスは実際にリソースを表現する別のオブジェクトを包むラッパーになり、ラッパーの到達可能性によって実際のリソースの寿命が決まります重大な問題を尋ねることを意味します。 – Holger

答えて

12

official documentationがこれをカバーしています。ファイナライズを無効にするために

()、あなたがする必要があるのは、単純にoverrideキーワードを使用せずに、それを宣言されています

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

秒でそれに私を打つ:) – ean5533

+0

ありがとう!それが私が必要なものすべてです!しかし、stackoverflowが12分前にanwserを選択することを禁止する理由は... – glee8e

関連する問題