и все работает отлично в любом случае.
ня я реализуюCloseable
в Kotlin, и, как я делал в Java в прошлом, я хочу реализоватьfinalize()
в качестве крайней меры в случае, если клиентский код забывает закрыть его, что делает критически важный ресурс невостребованным. Я считаю этот ресурс достаточно важным, чтобы добавить этот запасной вариант, несмотря на ненадежность этого запасного варианта. Тем не мение,kotlin.Any
не объявляетfinalize
метод, который означает, что я не могу просто сделать это:
class Resource: Closeable {
fun close() {}
override fun finalize() { close()}
}
Это не хорошо, по крайней мере, не так хорошо, как должно быть. Теперь я возвращаюсь к простой Java в качестве обходного пути. Кто-нибудь знает, как это сделать на чистом Kotlin?
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() {}
}