Kotlinにおける「シングルトン(Singleton)」は、あるクラスのインスタンスがアプリケーション全体でただ1つだけであることを保証するデザインパターンです。Kotlinでは、objectキーワードを使うことで、シングルトンを簡潔かつ安全に実現できます。
Kotlinにおけるシングルトンの定義
Kotlinでは、以下のようにobjectキーワードを使ってシングルトンを定義します。
このLoggerオブジェクトは、アプリケーション中でただ1つのインスタンスしか持ちません。クラス定義の代わりにobjectを使うことで、自動的にインスタンス化され、どこからでもアクセス可能になります。
シングルトンの主な特徴
| 特徴 | 説明 |
|---|---|
| インスタンスは1つだけ | objectで定義されたオブジェクトはアプリケーション全体で1つだけです。 |
| スレッドセーフ | Kotlinのobjectは、初期化時にスレッドセーフになるように言語レベルで保証されています。 |
| クラスのようにメソッドやプロパティを定義可能 | 通常のクラスと同様に関数や変数を内部に持つことができます。 |
| 初期化ブロック使用可能 | initブロックを使って初期化処理を書くことができます。 |
使用例
上記の例では、Loggerオブジェクトのlogメソッドを直接呼び出すことができます。
シングルトンに状態を持たせる
このように、シングルトンに状態(プロパティ)を持たせ、アプリケーション全体で共有することができます。
Javaのシングルトンとの比較
| 比較項目 | Kotlin (object) |
Java (従来のシングルトン) |
|---|---|---|
| 定義の簡潔さ | 非常に簡潔(1行で定義) | プライベートコンストラクタ+静的メソッドが必要 |
| スレッドセーフ性 | 言語仕様で保証されている | 明示的に対策が必要 |
| ボイラープレート | 少ない | 多い |
注意点
-
シングルトンに状態を持たせる場合、グローバル状態となるため、テストや保守性の面で慎重に設計すべきです。
-
Android開発では
ContextやUI要素などをシングルトンで保持しないよう注意が必要です(メモリリークの原因になります)。
まとめ
Kotlinでは、objectキーワードを使うことでシングルトンを簡潔に、安全に定義できます。設計次第では強力なツールとなりますが、状態の持たせ方や使用範囲には注意が必要です。
生成日:2025/05/04