Quando tentei escrever o equivalente a um try
código Java com recursos no Kotlin, não funcionou para mim.
Tentei diferentes variações do seguinte:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Mas nem funciona.
Alguém sabe o que deve ser usado? Aparentemente, a gramática de Kotlin não tem definição para essa construção, mas talvez eu esteja perdendo alguma coisa. Ele define a gramática para o bloco try da seguinte maneira:
try : "try" block catchBlock* finallyBlock?;
OutputStreamWriter
:r.outputStream.writer.use { ... }
use
extensão: kotlinlang.org/docs/reference/…FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
TL; DR: Nenhuma sintaxe especial, apenas uma função
O Kotlin, ao contrário do Java, não possui uma sintaxe especial para isso. Em vez disso, tente com recursos , é oferecido como a função de biblioteca padrão
use
.As
use
implementaçõesEsta função é definida como uma extensão genérica em todos os
Closeable?
tipos.Closeable
é a interface do Java que permite tentar com recursos a partir do Java SE7 .A função aceita literalmente uma função
block
que é executada em atry
. Igual ao try-with-resources em Java, oCloseable
é fechado em umfinally
.Além disso, falhas ocorridas no interior
block
levam aclose
execuções, onde possíveis exceções são literalmente "suprimidas" simplesmente ignorando-as. Isso é diferente da tentativa com recursos , porque essas exceções podem ser solicitadas na solução do Java .Como usá-lo
A
use
extensão está disponível em qualquerCloseable
tipo, como fluxos, leitores e assim por diante.A parte entre chaves é o que torna-se
block
nouse
(a lambda é passado como um argumento aqui). Após a conclusão do bloqueio, você pode ter certeza de queFileInputStream
foi fechado.fonte
Editar : A resposta a seguir ainda é válida para o Kotlin 1.0.x. Para o Kotlin 1.1, há suporte a uma biblioteca padrão que visa o Java 8 para suportar o padrão de recurso que pode ser fechado.
Para outras classes que não oferecem suporte à função "use", executei o seguinte teste caseiro com recursos:
Então você pode usá-lo da seguinte maneira:
fonte
try/finally
bloco simplesComo esta postagem do StackOverflow está perto do topo dos resultados atuais da pesquisa "exemplo fechado do kotlin", e ainda nenhuma das outras respostas (nem os documentos oficiais) explica claramente como estender
Closeable
(akajava.io.Closeable
), pensei em adicionar um exemplo de como criar sua própria classe que se estendeCloseable
. É assim:E então para usá-lo:
Veja este exemplo no Kotlin Playground aqui .
fonte