TL; DR:特別な構文はなく、関数のみ
Javaとは対照的に、Kotlinにはこのための特別な構文はありません。代わりに、try-with-resourcesが標準ライブラリ関数として提供されています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?
タイプの一般的な拡張として定義されています。Java SE7の時点でリソースを試すことができるCloseable
Javaのインターフェースです。
この関数は、で実行される関数リテラルを取ります。同じのtry-と資源 Javaで、取得し閉じで。
block
try
Closeable
finally
また、内部で発生した障害は実行にblock
つながりclose
、可能な例外は無視するだけで文字通り「抑制」されます。このような例外はJavaのソリューションで要求できるため、これはtry-with-resourcesとは異なります。
どうやって使うのですか
use
拡張子は、任意の上で利用可能であるCloseable
読者とそうで、すなわちストリーム、タイプ。
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
中括弧で囲まれた部分が何になるかblock
ですuse
(ここでは引数としてラムダが渡されます)。ブロックが完了したら、それがFileInputStream
閉じられていることを確認できます。