blog.bouzuya.net

2020-10-07 Kotlin の data class の constructor を private にする

Kotlin の data class は copy というメソッドを生成するので private constructor と書くと次のような警告が出る。

Private data class constructor is exposed via the generated 'copy' method.

たとえば次のような K があるとする。

package com.example

// private の箇所で警告が表示される
data class K private constructor(val p: Boolean) {
    companion object {
        fun of(p: Boolean): K = K(p)
    }
}

copy メソッドが生成されるので K.of(true).copy(p = false) のように呼べてしまう。

こういう場合は K を interface にして実装として data class を使用すると良さそうだ。

package com.example

interface K {
    val p: Boolean

    companion object {
        fun of(p: Boolean): com.example.K = K(p)
    }

    private data class K(override val p: Boolean) : com.example.K
}

これで data class によって生成される equals などが使えるし private constructor になる。名前を同じにしているのは生成される toString の挙動を元のクラスに近づけるためで気にしないなら別の名前で良い。


スプーンとフォークが届いた。いろいろあってスプーンが足りなくなっていたので助かる。