CORDEA blog

Android applications engineer

Jetpack Compose の @Model で生成されるコード

メモ

こういうの書いたときに生成されるコードが気になっていた

@Model
class AnimalState(
    var isAnimal: Boolean,
    var cats: List<Cat>,
    var dog: Dog
)

@Model
class Cat(
    var isRunning: Boolean,
    var isWalking: Boolean
)

@Model
class Dog(
    var count: Int,
    var type: Type
) {
    enum class Type {
        BULLDOG,
        DACHSHUND,
        SHIBA
    }
}

build 配下を見て Kotlin で書き直すと概ねこんな感じになりそう

class AnimalState(
    isAnimal: Boolean,
    cats: List<Cat>,
    dog: Dog
) : Framed {
    private var record: Record = Record()

    private val readable
        get() = _readable(
            record,
            this
        ) as Record

    private val writable
        get() = _writable(
            record,
            this
        ) as Record

    var isAnimal: Boolean
        get() = readable.isAnimal
        set(value) {
            writable.isAnimal = value
        }

    var cats: List<Cat>
        get() = readable.cats
        set(value) {
            writable.cats = value
        }

    var dog: Dog
        get() = readable.dog!!
        set(value) {
            writable.dog = value
        }

    init {
        record.isAnimal = isAnimal
        record.cats = cats
        record.dog = dog
        _created(this)
    }

    override val firstFrameRecord: Record
        get() = record

    override fun prependFrameRecord(value: androidx.compose.frames.Record) {
        value.next = record
        record = value as Record
    }

    class Record : AbstractRecord() {
        var isAnimal: Boolean = false
        var cats: List<Cat> = emptyList()
        var dog: Dog? = null

        override fun assign(value: androidx.compose.frames.Record) {
            (value as Record).let {
                isAnimal = it.isAnimal
                cats = it.cats
                dog = it.dog
            }
        }

        override fun create(): androidx.compose.frames.Record = Record()
    }
}

class Cat(
    isRunning: Boolean,
    isWalking: Boolean
) : Framed {
    private var record = Record()

    private val readable
        get() = _readable(
            record,
            this
        ) as Record

    private val writable
        get() = _writable(
            record,
            this
        ) as Record

    var isRunning: Boolean
        get() = readable.isRunning
        set(value) {
            writable.isRunning = value
        }

    var isWalking: Boolean
        get() = readable.isWalking
        set(value) {
            writable.isWalking = value
        }

    init {
        record.isRunning = isRunning
        record.isWalking = isWalking
        _created(this)
    }

    override val firstFrameRecord: Record get() = record

    override fun prependFrameRecord(value: androidx.compose.frames.Record) {
        value.next = record
        record = value as Record
    }

    class Record : AbstractRecord() {
        var isRunning: Boolean = false
        var isWalking: Boolean = false

        override fun assign(value: androidx.compose.frames.Record) {
            (value as Record).let {
                isRunning = it.isRunning
                isWalking = it.isWalking
            }
        }

        override fun create(): androidx.compose.frames.Record = Record()
    }
}

class Dog(
    count: Int,
    type: Type
) : Framed {
    private var record = Record()

    private val readable
        get() = _readable(
            record,
            this
        ) as Record

    private val writable
        get() = _writable(
            record,
            this
        ) as Record

    var count: Int
        get() = readable.count
        set(value) {
            writable.count = value
        }

    var type: Type
        get() = readable.type
        set(value) {
            writable.type = value
        }

    init {
        record.count = count
        record.type = type
        _created(this)
    }

    override val firstFrameRecord: Record get() = record

    override fun prependFrameRecord(value: androidx.compose.frames.Record) {
        value.next = record
        record = value as Record
    }

    enum class Type {
        BULLDOG,
        DACHSHUND,
        SHIBA
    }

    class Record : AbstractRecord() {
        var count: Int = 0
        var type: Type = Type.BULLDOG

        override fun assign(value: androidx.compose.frames.Record) {
            (value as Record).let {
                count = it.count
                type = it.type
            }
        }

        override fun create(): androidx.compose.frames.Record = Record()
    }
}

なるほどー