今日、私は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() {}
}
https://kotlinlang.org/docs/reference/java- interop.html#finalize – ean5533
@ ean5533私はその長い相互運用性の文書を完全には読まなかったので、今は私の罰です。とにかくありがとうございました。 – glee8e
「[Java 8で強く到達可能なオブジェクトで呼び出された(finalize()](https://stackoverflow.com/q/26642153/2711488)」を読んだことがありますか?結論は、あなたはそれを全くしない方がいいでしょう。あなたのコードがシステムリソースを直接扱う 'ネイティブ'コードを必要としない限り、あなたのクラスは実際にリソースを表現する別のオブジェクトを包むラッパーになり、ラッパーの到達可能性によって実際のリソースの寿命が決まります重大な問題を尋ねることを意味します。 – Holger