Heute implementiere ich eine Closeable
in Kotlin, und wie ich in Java in der Vergangenheit getan habe, möchte ich ein finalize()
als letztes Ausweichsystem implementieren, falls der Client-Code vergisst, es zu schließen, kritische Ressource un-zurückgefordert . Ich betrachte diese Ressource als kritisch genug, um diesen Fallback hinzuzufügen, trotz der Unzuverlässigkeit dieses Fallbacks. Allerdings ist kotlin.Any
keine finalize
Methode, erklären, was bedeutet, dass ich nicht diese simplydo kann:Wie finalize() in Kotlin implementieren?
class Resource: Closeable {
fun close() {}
override fun finalize() { close()}
}
Das ist nicht gut, zumindest nicht so gut, wie es sein sollte. Jetzt kehre ich zur Umgehung auf Java zurück. Weiß jemand, wie man das in reinem Kotlin macht?
PS: Meine aktuelle Problemumgehung:
FinalizedCloseable.java:
public abstract class FinalizedCloseable implement Closeable {
@Override protected void finalize() { close(); }
}
Kotlin:
class Resource: FinalizedCloseable(), Closeable {
fun close() {}
override fun finalize() { close()}
}
Aber diese Problemumgehung erfordert eine übergeordnete Klasse. Wenn das nächste Mal meine andere Resource
bereits eine Superklasse hat, wird diese Problemumgehung nicht ohne eine Menge Standard-Code funktionieren.
EDIT: Jetzt weiß ich, wie finalisieren zu implementieren(), aber IDEA Kotlin Plugin ist nicht klug genug zu wissen, dass dies ein Finalizerthread und damit es mit etwas Warnung markieren. Nach dem Kampf für eine Weile fand ich, wie man diese Warnungen zu unterdrücken, und ich möchte es teilen:
class C {
@Suppress("ProtectedInFinal", "Unused") protected fun finalize() {}
}
https://kotlinlang.org/docs/reference/java- interop.html # finalize – ean5533
@ ean5533 Uh Ich habe diesen langen Interop Doc nicht komplett gelesen, und jetzt ist meine Strafe. Trotzdem danke. – glee8e
Haben Sie gelesen "[finalize() forderte stark erreichbare Objekt in Java 8] (https://stackoverflow.com/q/26642153/2711488)"? Die Quintessenz ist, sollten Sie das überhaupt nicht tun. Wenn Ihr Code nicht "nativen" Code enthält, der direkt mit einer Systemressource arbeitet, ist Ihre Klasse ein Wrapper um ein anderes Objekt, das tatsächlich die Ressource darstellt und die Erreichbarkeit des Wrappers die Lebensdauer der tatsächlichen Ressource bestimmt (die noch erreichbar sein könnte und im Gebrauch), bedeutet, nach ernsten Problemen zu fragen ... – Holger