Edited at

Kotlinのデータクラスにファクトリメソッドを用意したい


概要

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に限らず、他の言語でもファクトリメソッドを作るときに参考になりそう。


参考

https://www.reddit.com/r/Kotlin/comments/78dl7m/data_class_factory_constructor_issue/dowt2dr