Quand j'ai essayé d'écrire un équivalent d'un try
code Java avec ressources dans Kotlin, cela n'a pas fonctionné pour moi.
J'ai essayé différentes variantes de ce qui suit:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Mais ni l'un ni l'autre ne fonctionne.
Quelqu'un sait-il ce qui devrait être utilisé à la place? Apparemment, la grammaire de Kotlin n'a pas de définition pour une telle construction, mais il me manque peut-être quelque chose. Il définit la grammaire du bloc try comme suit:
try : "try" block catchBlock* finallyBlock?;
OutputStreamWriter
aussi:r.outputStream.writer.use { ... }
use
extension: kotlinlang.org/docs/reference/…FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
TL; DR: Pas de syntaxe spéciale, juste une fonction
Kotlin, contrairement à Java, n'a pas de syntaxe spéciale pour cela. Au lieu de cela, try-with-resources est proposé comme fonction de bibliothèque standard
use
.Les
use
implémentationsCette fonction est définie comme une extension générique sur tous les
Closeable?
types.Closeable
est l' interface de Java qui permet d' essayer avec des ressources à partir de Java SE7 .La fonction prend une fonction littérale
block
qui est exécutée dans un fichiertry
. Comme avec try-with-resources en Java, leCloseable
se ferme dans unfinally
.Les échecs qui se produisent à l'intérieur
block
mènent également à desclose
exécutions, où les exceptions possibles sont littéralement "supprimées" en les ignorant simplement. Ceci est différent de try-with-resources , car de telles exceptions peuvent être demandées dans la solution Java .Comment l'utiliser
L'
use
extension est disponible sur n'importe quelCloseable
type, c'est-à-dire les flux, les lecteurs, etc.La partie entre accolades est ce qui devient
block
inuse
(un lambda est passé comme argument ici). Une fois le blocage terminé, vous pouvez être sûr qu'ilFileInputStream
a été fermé.la source
Edit : La réponse suivante est toujours valable pour Kotlin 1.0.x. Pour Kotlin 1.1, il existe une prise en charge d'une bibliothèque standard qui cible Java 8 pour prendre en charge les modèles de ressources fermables.
Pour les autres classes qui ne prennent pas en charge la fonction "utiliser", j'ai effectué l'essai avec les ressources maison suivant:
Ensuite, vous pouvez l'utiliser de la manière suivante:
la source
try/finally
blocÉtant donné que cet article de StackOverflow se trouve presque en haut des résultats de recherche actuels pour "kotlin closeable example", et pourtant aucune des autres réponses (ni la documentation officielle) n'explique clairement comment étendre
Closeable
(akajava.io.Closeable
), j'ai pensé ajouter un exemple comment créer votre propre classe qui s’étendCloseable
. Ça va comme ça:Et puis pour l'utiliser:
Voir cet exemple dans le Kotlin Playground ici .
la source