Как реализовать finalize () в Котлине?

сегодня я внедряю 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 уже есть суперкласс, этот обходной путь не будет работать без большого количества шаблонных.


EDIT: теперь я знаю, как реализовать finalize(), но плагин IDEA kotlin недостаточно умен, чтобы знать, что это финализатор и, таким образом, отметить его с некоторым предупреждением. После борьбы некоторое время я нашел, как подавить эти предупреждения, и я хочу поделиться им:

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

1 ответов


на официальная документация это покрывает.

чтобы переопределить finalize (), все, что вам нужно сделать, это просто объявить его, не используя ключевое слово override:

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