Aujourd'hui, j'implémente un Closeable
dans kotlin, et comme je l'ai fait dans Java dans le passé, je veux implémenter une finalize()
en dernier recourir au repli au cas où le code client oublie de le fermer, rendant la ressource critique non récupérée. Je considère que cette ressource est suffisamment critique pour ajouter ce repli, malgré le manque de fiabilité de ce repli. Cependant, kotlin.Any
ne déclare pas une méthode finalize
, ce qui signifie que je ne peux pas simplifier ceci:
class Resource: Closeable {
fun close() {}
override fun finalize() { close()}
}
Ce n'est pas bon, du moins pas aussi bon qu'il devrait l'être. Maintenant, je reviens à plain Java comme solution de contournement. Est-ce que quelqu'un sait comment faire cela en Kotlin pur?
PS: Ma solution de contournement actuelle:
FinalizedCloseable.Java:
public abstract class FinalizedCloseable implement Closeable {
@Override protected void finalize() { close(); }
}
Kotlin:
class Resource: FinalizedCloseable(), Closeable {
fun close() {}
override fun finalize() { close()}
}
Mais cette solution de contournement nécessite une superclasse. Si la prochaine fois que mon autre Resource
a déjà une superclasse, cette solution de contournement ne fonctionnera pas sans beaucoup de passe-partout.
EDIT: Maintenant, je sais comment implémenter finalize (), mais IDEA plugin kotlin n'est pas assez intelligent pour savoir qu'il s'agit d'un finaliseur et donc le marquer avec un avertissement. Après avoir lutté pendant un moment J'ai trouvé comment supprimer ces avertissements et je veux le partager:
class C {
@Suppress("ProtectedInFinal", "Unused") protected fun finalize() {}
}
Le documentation officielle couvre cela.
Pour remplacer finalize (), il vous suffit de le déclarer, sans utiliser le mot clé override:
class C {
protected fun finalize() {
// finalization logic
}
}