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 変数がないため、その代わりとして使うことができます。
実行結果
シングルトンをクラスの一部として直接使用できるようになります。
シングルトンのため、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