更新(2022/08/26)
lazy
を使えば事足りる、車輪の再発明だったので本記事の内容は非推奨です。
参考:https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/src/kotlin/util/LazyJVM.kt
当初の内容
当初の内容
Google謹製のサンプルコードをいろいろあさっているときに、KotlinでSingletonパターン作るときのお手本みたいなやつをみつけたので紹介します。
要点をまとめると、こんな感じのコードになるでしょうか。
class DaijiNaMono {
companion object {
@Volatile private var INSTANCE: DaijiNaMono? = null
fun getInstance(): DaijiNaMono =
INSTANCE ?: synchronized(this) {
// 待ってる間に他のスレッドで生成されるかもしれないから再確認
INSTANCE ?: DaijiNaMono().also { INSTANCE = it }
}
}
}
普通にObjectでインスタンスを保持できるときはそうすればいいんですが、そうできないときに上記のテクニックが使えそうです。
companion objectはそれを持つクラスが呼ばれたときに生成されてしまうので、それを遅延したいときはこういうコードが欲しくなるんじゃないでしょうか。
普通にオブジェクトを使うのがわからない人は公式ドキュメントが役に立つと思います。
読みましょう
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/object-declarations.html