2017-05-04 3 views
8

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() {} 
} 
+1

https://kotlinlang.org/docs/reference/java- interop.html # finalize – ean5533

+0

@ ean5533 Uh Ich habe diesen langen Interop Doc nicht komplett gelesen, und jetzt ist meine Strafe. Trotzdem danke. – glee8e

+0

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

Antwort

12

Die official documentation deckt diese.

außer Kraft zu setzen finalize(), alles, was Sie tun müssen, einfach erklären, ohne dass die Überschreibung Schlüsselwort:

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

Beat mich dazu Sekunden :) – ean5533

+0

Danke! Das ist alles was ich brauche! Aber warum Stackoverflow verbietet die Auswahl der Anwsser vor 12 Minuten eingefügt haben ... – glee8e