今日、私はkotlinにCloseable
を実装しています。過去にJavaで行ったように、finalize()
を最後の手段として実装したい場合は、クライアントコードはそれを閉じるのを忘れて、重要なリソースを解放されない状態にします。このフォールバックの信頼性は低いものの、このリソースはこのフォールバックを追加するのに十分重要であると考えています。ただし、kotlin.Any
はfinalize
メソッドを宣言していません。つまり、これを単純に行うことはできません。
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() {}
}
公式ドキュメント がこれをカバーしています。
Finalize()をオーバーライドするには、overrideキーワードを使用せずに、宣言するだけです。
class C {
protected fun finalize() {
// finalization logic
}
}