LoginSignup
24
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-10

概要

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

参考

24
16
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
16