Kotlinのobjectを理解する【Androidアプリ開発】

Kotlinのobjectを理解する【Androidアプリ開発】
Kotlinのobjectを理解する【Androidアプリ開発】

objectを使っていくつか遊びがてら実験してみた。オブジェクトに関してもやもやしていたが少しだけつかめてきた気がする。

companion objectでシングルトンの動作確認

Kotlinでcompanion objectを使って、JavaのStaticみたいな動作を行ってみた。次のHogeクラスはシングルトンパターンの基本的な形である。

kotlin
class Hoge {
    companion object{
        var counter:Int = 0
    }

    fun countUp():Int {
        return counter++
    }
}

fun main() {
    val hoge1 = Hoge()

    println("hoge1 : ${hoge1.countUp()}")
    println("hoge1 : ${hoge1.countUp()}")
    println("hoge1 : ${hoge1.countUp()}")
    println("hoge1 : ${hoge1.countUp()}")

    val hoge2 = Hoge()
    println("hoge2 : ${hoge2.countUp()}")
    println("hoge2 : ${hoge2.countUp()}")
    println("hoge2 : ${hoge2.countUp()}")
    println("hoge1 : ${hoge1.countUp()}")

}

実行結果は次の通りとなる。確かにcompanion objectで囲まれた変数counterはインスタンスが1つだけとなっているようだ。

hoge1 : 0
hoge1 : 1
hoge1 : 2
hoge1 : 3
hoge2 : 4
hoge2 : 5
hoge2 : 6
hoge1 : 7

メソッドの関数オブジェクト

次のプログラム内のように、関数自体をオブジェクトとして扱う使うことができる。ただし、Hogeクラスのインスタンスを生成する必要がある。

kotlin
class Hoge {
    var counter:Int = 0

    fun countUp():Int {
        return counter++
    }
}

fun main() {
    
    val hoge = Hoge()
    val countUp = hoge::countUp

    println("countUp1 : ${countUp()}")
    println("countUp1 : ${countUp()}")
    println("countUp1 : ${countUp()}")
    println("countUp1 : ${countUp()}")

}

実行結果は次の通り。

countUp1 : 0
countUp1 : 1
countUp1 : 2
countUp1 : 3

インタフェースとオブジェクトの組み合わせ

次のプログラムはOkHttpのCallbackで使うようなパターンだ。

kotlin
interface Hoge {
    var counter:Int
    fun countUp():Int
}

val hoge = object:Hoge {
    init {
        counter = 0
    }

    override var counter: Int
        get() {
            println("counter ゲット ($field)")
            return field
        }
        set(value) {
            println("counter セット (${value})")
            field = value
        }

    override fun countUp(): Int {
        counter++
        return counter
    }

}

fun main() {
    
    hoge.countUp()
    hoge.countUp()
    hoge.countUp()
    hoge.countUp()
    hoge.countUp()

}

実行結果は次の通りとなる。

counter セット (0)
counter ゲット (0)
counter セット (1)
counter ゲット (1)
counter ゲット (1)
counter セット (2)
counter ゲット (2)
counter ゲット (2)
counter セット (3)
counter ゲット (3)
counter ゲット (3)
counter セット (4)
counter ゲット (4)
counter ゲット (4)
counter セット (5)
counter ゲット (5)

▼ こんな記事も書いてます。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事