【Kotlin/Android Studio】Companion objectとは?staticなシングルトン
この記事からわかること
- Android Studio/KotlinでCompanion objectの使い方
- シングルトンオブジェクトの作成方法
- staticな構造の作り方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:公式リファレンス:Companion objects
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Companion objectsとは?
KotlinのCompanion objectsとはクラス内で静的なメンバー変数やメソッドを定義するためのオブジェクトです。Companion objects
で定義されたオブジェクトはシングルトンになり、アプリ内でインスタンスは1つだけになります。実装するにはcompanion object
キーワードを付与するだけです。
おすすめ記事:【GoF】23種類のデザインパターンとは?#Singletonパターン
これはJavaやSwiftでいうstatic
と同じような振る舞いをします。
クラス内ではCompanion object
は1クラス内に1つだけしか定義できません。クラス内など関係なくシングルトンを実装できるobject
キーワードであればクラス内でも複数定義することが可能です。
class Database {
object Info {
const val capacity = 10
}
companion object {
fun create(): Database {
return Database()
}
}
}
Companion object
とobject
の違いはアクセスする際に現れます。object
にはオブジェクト名を付与する必要があり、アクセスする際もオブジェクト名を挟む必要があります。一方Companion object
では名前を省略することができるのでDatabase
直下の静的プロパティや静的メソッドのようにアクセスすることができます。
val capacity = Database.Info.capacity
var instance = Database.create()
もちろん名前をつけることも可能です。
companion object Factory {
fun create(): Database {
return Database()
}
}
その場合は以下のどちらでもアクセス可能です。
var instance = Database.create()
var instance = Database.Factory.create()
ちなみにインスタンス化用のcreate
メソッドのようなデザインパターンをFactory Methodと呼びます。
おすすめ記事:【Kotlin/Android Studio】Factory Methodデザインパターンとは?
シングルトンの使用例
Androidで使用できるローカルデータベースライブラリのRoomでもUserDatabase
クラスをシングルトンで実装するために以下のように実装することがあります。このようにシングルトンにすることで定型的なインスタンス化時の設定などを仕込むことができます。
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: UserDatabase? = null
fun getDatabase(context: Context): UserDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
UserDatabase::class.java,
"user_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
return instance
}
}
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。