web-dev-qa-db-ja.com

kotlinでfinalize()を実装する方法は?

今日、私はkotlinにCloseableを実装しています。過去にJavaで行ったように、finalize()を最後の手段として実装したい場合は、クライアントコードはそれを閉じるのを忘れて、重要なリソースを解放されない状態にします。このフォールバックの信頼性は低いものの、このリソースはこのフォールバックを追加するのに十分重要であると考えています。ただし、kotlin.Anyfinalizeメソッドを宣言していません。つまり、これを単純に行うことはできません。

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

これは良くありません。少なくとも本来あるべき状態ではありません。次に、回避策としてプレーンJavaに戻します。純粋なコトリンでこれを行う方法を知っている人はいますか?

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 kotlinプラグインは、これがファイナライザであることを認識して、いくつかの警告をマークするほどスマートではありません。しばらく苦労した後、私はこれらの警告を抑制する方法を見つけました、そして私はそれを共有したいと思います:

class C {
    @Suppress("ProtectedInFinal", "Unused") protected fun finalize() {}
}
20
glee8e

公式ドキュメント がこれをカバーしています。

Finalize()をオーバーライドするには、overrideキーワードを使用せずに、宣言するだけです。

class C {
    protected fun finalize() {
        // finalization logic
    }
}
27
zsmb13