TL; DR: ไม่มีไวยากรณ์พิเศษเพียงแค่ฟังก์ชั่น
Kotlin ซึ่งตรงกันข้ามกับ 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
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
ได้ว่าถูกปิด