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
の挙動を元のクラスに近づけるためで気にしないなら別の名前で良い。
スプーンとフォークが届いた。いろいろあってスプーンが足りなくなっていたので助かる。