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
.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
As use
implementações
@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var closed = false
try {
return block(this)
} catch (e: Exception) {
closed = true
try {
this?.close()
} catch (closeException: Exception) {
}
throw e
} finally {
if (!closed) {
this?.close()
}
}
}
Esta 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çãoblock
que é executada em a try
. Igual ao try-with-resources em Java, o Closeable
é fechado em um finally
.
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 qualquer Closeable
tipo, como fluxos, leitores e assim por diante.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
A parte entre chaves é o que torna-se block
no use
(a lambda é passado como um argumento aqui). Após a conclusão do bloqueio, você pode ter certeza de que FileInputStream
foi fechado.