TL; DR: Brak specjalnej składni, tylko funkcja
Kotlin w przeciwieństwie do Javy nie ma do tego specjalnej składni. Zamiast tego próbuj z zasobami jest oferowana jako standardowa funkcja biblioteki use
.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
W use
implementacje
@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()
}
}
}
Ta funkcja jest zdefiniowana jako ogólne rozszerzenie dla wszystkich Closeable?
typów. Closeable
jest interfejsem Java, który umożliwia wypróbowanie zasobów od wersji Java SE7 .
Funkcja przyjmuje literał funkcji, block
który jest wykonywany w pliku try
. Podobnie jak w przypadku try-with-resources w Javie, Closeable
zostaje zamknięty w pliku finally
.
Również awarie występujące w środku block
prowadzą do close
egzekucji, w których możliwe wyjątki są dosłownie „tłumione” poprzez ich ignorowanie. To różni się od try-with-zasobów , ponieważ takie wyjątki mogą być wymagane w Java rozwiązanie „s.
Jak tego użyć
use
Rozszerzenie jest dostępne na każdym Closeable
rodzaju, czyli strumienie, czytelnicy i tak dalej.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
Część w nawiasach klamrowych jest tym, co staje się block
w use
(tutaj jako argument jest przekazywana lambda). Po wykonaniu blokady możesz być pewien, że FileInputStream
została zamknięta.