【Kotlin/Android Studio】Companion objectとは?staticなシングルトン

この記事からわかること

  • Android Studio/KotlinCompanion object使い方
  • シングルトンオブジェクト作成方法
  • static構造作り方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:Companion objects

環境

Companion objectsとは?

KotlinのCompanion objectsとはクラス内で静的なメンバー変数やメソッドを定義するためのオブジェクトです。Companion objectsで定義されたオブジェクトはシングルトンになり、アプリ内でインスタンスは1つだけになります。実装するにはcompanion objectキーワードを付与するだけです。

おすすめ記事:【GoF】23種類のデザインパターンとは?#Singletonパターン

これはJavaやSwiftでいうstaticと同じような振る舞いをします。

クラス内ではCompanion object1クラス内に1つだけしか定義できません。クラス内など関係なくシングルトンを実装できるobjectキーワードであればクラス内でも複数定義することが可能です。

class Database {
    
    object Info {
        const val capacity = 10
    }
    
    companion object {
        fun create(): Database {
            return Database()
        }
    }
}

Companion objectobjectの違いはアクセスする際に現れます。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
            }
        }
    }
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index