シングルトン

Kotlinにおける「シングルトン(Singleton)」は、あるクラスのインスタンスがアプリケーション全体でただ1つだけであることを保証するデザインパターンです。Kotlinでは、objectキーワードを使うことで、シングルトンを簡潔かつ安全に実現できます。


Kotlinにおけるシングルトンの定義

Kotlinでは、以下のようにobjectキーワードを使ってシングルトンを定義します。

kotlin
object Logger { fun log(message: String) { println("Log: $message") } }

このLoggerオブジェクトは、アプリケーション中でただ1つのインスタンスしか持ちません。クラス定義の代わりにobjectを使うことで、自動的にインスタンス化され、どこからでもアクセス可能になります。


シングルトンの主な特徴

特徴 説明
インスタンスは1つだけ objectで定義されたオブジェクトはアプリケーション全体で1つだけです。
スレッドセーフ Kotlinのobjectは、初期化時にスレッドセーフになるように言語レベルで保証されています。
クラスのようにメソッドやプロパティを定義可能 通常のクラスと同様に関数や変数を内部に持つことができます。
初期化ブロック使用可能 initブロックを使って初期化処理を書くことができます。

使用例

kotlin
fun main() { Logger.log("アプリケーションを開始します") }

上記の例では、Loggerオブジェクトのlogメソッドを直接呼び出すことができます。


シングルトンに状態を持たせる

kotlin
object Counter { var count = 0 fun increment() { count++ } fun getCount(): Int = count }
kotlin
fun main() { Counter.increment() Counter.increment() println("カウント値: ${Counter.getCount()}") // 結果: カウント値: 2 }

このように、シングルトンに状態(プロパティ)を持たせ、アプリケーション全体で共有することができます。


Javaのシングルトンとの比較

比較項目 Kotlin (object) Java (従来のシングルトン)
定義の簡潔さ 非常に簡潔(1行で定義) プライベートコンストラクタ+静的メソッドが必要
スレッドセーフ性 言語仕様で保証されている 明示的に対策が必要
ボイラープレート 少ない 多い

注意点

  • シングルトンに状態を持たせる場合、グローバル状態となるため、テストや保守性の面で慎重に設計すべきです。

  • Android開発ではContextやUI要素などをシングルトンで保持しないよう注意が必要です(メモリリークの原因になります)。


まとめ

Kotlinでは、objectキーワードを使うことでシングルトンを簡潔に、安全に定義できます。設計次第では強力なツールとなりますが、状態の持たせ方や使用範囲には注意が必要です。

生成日:2025/05/04