TL; DR: Tidak ada sintaks khusus, hanya sebuah fungsi
Kotlin, tidak seperti Java, tidak memiliki sintaks khusus untuk ini. Sebaliknya, coba-dengan-sumber daya , ditawarkan sebagai fungsi perpustakaan standar use
.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
The use
implementasi
@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()
}
}
}
Fungsi ini didefinisikan sebagai ekstensi umum pada semua Closeable?
jenis. Closeable
adalah antarmuka Java yang memungkinkan coba-dengan-sumber daya pada Java SE7 .
Fungsi ini mengambil fungsi literal block
yang dijalankan di a try
. Sama seperti dengan coba-dengan-sumber daya di Jawa, Closeable
akan ditutup dalam a finally
.
Juga kegagalan yang terjadi di dalam block
menyebabkan close
eksekusi, di mana kemungkinan pengecualian secara harfiah "ditekan" dengan hanya mengabaikannya. Ini berbeda dari coba-dengan-sumber daya , karena pengecualian seperti itu dapat diminta dalam solusi Java .
Bagaimana cara menggunakannya
The use
ekstensi tersedia pada setiap Closeable
jenis, yaitu sungai, pembaca dan sebagainya.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
Bagian dalam kurung keriting adalah apa yang menjadi block
dalam use
(lambda dilewatkan sebagai argumen di sini). Setelah blok selesai, Anda dapat yakin bahwa FileInputStream
itu telah ditutup.