Как реализовать 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
}
}