🙆

サンプルコードの中にuseが現れた!どうする? ▶︎ useを学習する

2022/10/21に公開

サンプルコード

val file = File("/path/to/hogehoge.txt")
file.bufferedReader().use {
  println(it.read())
}

サンプルコードの中に use が現れた!どうする?

use を学習する

use の定義を見てみる

useの定義
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R { ... }
呼び出し方
// 何かはCloseable (何か.close()が呼び出せる)
何か.use { it:何か ->
  ...
}

use の実装を見てみる

useの実装
// 大事なところだけ
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
  try{
    // blockを実行する
    return block()
  } catch (e: Throwable) {
    // エラーが発生したらそれを再度throwする
    exception = e
    throw e
  } finally{
    // エラーが発生してもしなくてもcloseする
    close()
  }
}

Closeable を use で呼び出すと何がいいの?

useで囲んんだら囲んだブロック({から})を呼び出した後 必ず close()されます。 これにより、「呼び出した後必ず close()してね!」といったクラスを使うときにエラー発生の有無に関わらずclose()してくれます。

use、完全に理解した!

⭐️⭐️⭐️ これであなたも Kotlin レベルアップです ⭐️⭐️⭐️


java 経験者の方へ

Kotlin の use は java で言う catch しない try-with-resource です

python 経験者の方へ

Kotlin の use は python で言う with 句です

Discussion