👨💻
オブジェクトの勉強
静的インスタンスとは?
静的インスタンスは、プログラム内で1つだけ存在するオブジェクトです。どこからでも同じインスタンスにアクセスでき、その中に保存された状態やデータが全体で共有されます。
通常のオブジェクトは、必要に応じて複数のインスタンスを生成できます。
例:HogeClass
があったらHogeClass()
みたいな感じで
Kotlinでは、この仕組みを実現するために主に2つの方法があります。
object
宣言によるシングルトンパターン
1. 書く理由
プロジェクト内で既存画面の値をそのまま流用する場所があったが画像データだったので値の受け渡しとかでうまくいかなかった。
しかしそもそも既存の定義は静的インスタンスのオブジェクトを使用しているため、そのまま流用できるよという反省点があったため
概要
- シングルトンパターン: クラスのインスタンスが1つだけ存在するようにする設計パターン。
- Kotlinでは、
object
キーワードを使うだけでシンプルトンを簡単に実現できる。
コード例
object HogeSingleton {
var counter: Int = 0
fun showCounter() {
println("カウンター数: $counter")
}
}
fun main() {
// どこからでも同じHogeSingletonにアクセスできる
HogeSingleton.counter += 1
HogeSingleton.showCounter() // 出力例: カウンター数: 1
}
fun main2() {
// 他の場所からも同じ状態が利用可能(クラスでも同様に)
HogeSingleton.counter += 2
HogeSingleton.showCounter() // 出力例: カウンター数: 3
}
説明
-
HogeSingleton
はobject
で宣言されているため、プログラム全体で 1つだけのインスタンス が作られる。 -
counter
やshowCounter()
はどこからでもアクセス可能で、状態が共有される。 - 通常オブジェクトはインスタンスごとに値は変わっていく
companion object
を使った静的メンバー
2. 概要
- クラスの中で静的なメンバー(メソッドやプロパティ)を定義するために、Kotlinでは
companion object
を使う。 - Javaの
static
と似た役割を持ち、インスタンスを生成せずにクラス名から直接アクセスできる。
コード例
class MyClass {
companion object {
var sharedData: String = "初期データ"
fun printData() {
println("共有データ: $sharedData")
}
}
}
fun main() {
// MyClassのインスタンスを作らなくてもアクセスできる
println(MyClass.sharedData) // 出力例: 初期データ
MyClass.sharedData = "更新されたデータ"
MyClass.printData() // 出力例: 共有データ: 更新されたデータ
}
説明
-
MyClass
内のcompanion object
は クラスにひもづくシングルトンオブジェクト。 -
sharedData
やprintData()
はクラス名を通じて直接アクセスでき、どこからでも同じ状態を扱う。
静的インスタンスを使うメリット
- 一元管理: グローバルな設定や共通のリソース(例: ログ出力、キャッシュ)を1箇所で管理できる。
- 状態の共有: どこからでも同じインスタンスにアクセスできるため、状態が統一される。
-
簡潔なコード:
object
やcompanion object
を使うことで、シングルトンの実装がシンプルになる。
注意点として
-
過剰な使用は避けた方がいい:
例えば全てを静的に管理すると、テストや保守が難しくなることもある。必要な箇所に限定して使用することが適切。 -
状態の管理:
静的な状態はプログラム全体で共有されるため、予期せぬ値の変更やバグの原因になることがあるので、状態の変更には影響範囲などに注意が必要。
まとめ
-
object
宣言 は、Kotlinでシングルトン(静的インスタンス)を実現するための最もシンプルな方法。 -
companion object
は、クラスにひもづく静的なプロパティやメソッドを定義するために使使われる。 - 静的インスタンスは状態の共有や一元管理に役立ちますが、使いすぎるとメンテナンス性が低下するため、適切な使い方が重要。
結構いろんなところで多用されるっぽいので抑えておきたい。
Discussion