TL; DR: Немає спеціального синтаксису, лише функція
Котлін, на відміну від Java, не має для цього спеціального синтаксису. Натомість спробувати з ресурсами пропонується як стандартна функція бібліотеки use
.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
У use
реалізації
@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()
}
}
}
Ця функція визначається як загальне розширення для всіх Closeable?
типів. Closeable
це інтерфейс Java, який дозволяє пробувати ресурси з Java SE7 .
Функція приймає літерал функції, block
який виконується в a try
. Те ж саме з приміркою з-ресурсами в Java, то Closeable
отримує закрито в finally
.
Також невдачі, що трапляються всередині, block
призводять до close
страти, де можливі винятки буквально «придушуються» шляхом просто їх ігнорування. Це відрізняється від пробних ресурсів , оскільки такі винятки можна вимагати в рішенні Java .
Як ним користуватися
use
Розширення є на будь-якому Closeable
типі, тобто потоки, читачі і так далі.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
Частина в фігурних дужках , що стає block
в use
(лямбда передається в якості аргументу тут). Після завершення блоку ви можете бути впевнені, що FileInputStream
його закрили.