9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kotlinでいい感じにSingletonパターンを書く

Last updated at Posted at 2018-11-07

更新(2022/08/26)

lazyを使えば事足りる、車輪の再発明だったので本記事の内容は非推奨です。
参考:https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/src/kotlin/util/LazyJVM.kt

当初の内容

当初の内容

Google謹製のサンプルコードをいろいろあさっているときに、KotlinでSingletonパターン作るときのお手本みたいなやつをみつけたので紹介します。

これです。
https://github.com/googlesamples/android-architecture-components/blob/master/BasicRxJavaSampleKotlin/app/src/main/java/com/example/android/observability/persistence/UsersDatabase.kt

要点をまとめると、こんな感じのコードになるでしょうか。

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

9
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?