Kotlin - クラス - シングルトン(object)

公開日:2019-11-25 更新日:2019-11-25
[Kotlin]

1. 概要

object を使うと、簡単にシングルトンのオブジェクトを作成することができます。


2. シングルトン(object)

interface ITest {
    fun test():String
}

object TestData:ITest {
    val a = 100

    override fun test():String {
        return "Test"
    }
}

fun main() {
    println(TestData.a)      // 100
    println(TestData.test()) // Test
}

クラス内のシングルトン(object)のオブジェクトにアクセスする場合は、
インスタンスからではなく、Test.TestData のように、クラスを指定してアクセスします。
class Test {
    object TestData {
        val value = 100
    }

    fun getValue():Int {
        return TestData.value
    }
}

fun main() {
    val o = Test()
    //println(o.TestData.value)  // エラー。インスタンスからはアクセスできない
    println(Test.TestData.value) // 100
    println(o.getValue())        // 100
}


3. companion object

クラス内のシングルトン(object)に companion を付けると、
シングルトンをクラスの一部として直接使用できるようになります。
シングルトンのため、init ブロックは一度しか処理されません。
Kotlin には static メソッド、static 変数がないため、その代わりとして使うことができます。

class Test {
    //companion object TestData { // TestData は省略可能
    companion object {
        var value:Int
        init {
            println("init") // 1度しか実行されない
            value = 100
        }
        fun print() {
            println(value)
        }
    }

    object TestData2 {
        var value:Int = 100
        fun print() = println(value)
    }

    fun printValue1() = println(Test.value)
    fun printValue2() = println(Test.TestData2.value)
}

fun main() {
    Test.print() // 100
    Test.value = 200
    Test.print() // 200

    println("-----")

    Test.TestData2.print() // 100
    Test.TestData2.value = 300
    Test.TestData2.print() // 300

    println("-----")

    val obj = Test()
    obj.printValue1() // 200
    obj.printValue2() // 300
}

実行結果
init
100
200
-----
100
300
-----
200
300