概要
data class Hoge private constructor(val fuga: String, val piyo: String1) {
companion object {
fun create() = Hoge("fuga", "piyo")
}
}
このようにしてデータクラスのファクトリメソッドを用意すると、以下のような警告が出る
Private data class constructor is exposed via the generated 'copy' method.
Inspection info: This inspection reports private constructors of data classes because they are always exposed via the generated copy method.
copyメソッドがあるからprivateにしても意味ないよってことみたい
例えば以下のようにすると、ファクトリで指定した値以外を持つデータクラスができてしまう。
val hoge = Hoge.create()
val hogeCopy = hoge.copy(fuga = "FUGA", piyo = "PIYO")
解決策
インタフェースを使う。
interface Hoge {
val fuga: String
val piyo: String
companion object {
fun create(): Hoge = HogeData("fuga", "piyo")
}
}
private data class HogeData(override val fuga: String, override val piyo: String) : Hoge
これだとcopyもできない。実体はデータクラスなのでequalsの判定もちゃんとされる。
参考ページを見て、なるほどと思いました。
これはKotlinに限らず、他の言語でもファクトリメソッドを作るときに参考になりそう。
参考