B-Teck!

お仕事からゲームまで幅広く

【Kotlin】data classにJavaから呼び出せるBuilderを用意する

はじめに

Kotlinには名前付き引数を利用することができるので、
コンストラクタに渡す引数をわかりやすく記述することができます。

Person(
  name = "taro",
  age = 20
)

しかし、JavaとKotlinが混在している場合は、Javaからは名前付き引数の仕組みを利用できません。
そうした場合には、KotlinのclassにBuilderを定義することで、
Java、Kotlin両方から扱いやすいclassにすることができます。

data classにBuilderを定義した例

以下の例はKotlinのdata classにBuilderを定義したものです。

data class Person(
    val name : String,
    val age : Int
) {
    class Builder(
        private var name : String? = null,
        private var age : Int? = null
    ) {
        fun name(name : String) = this.also { it.name = name }
        fun age(age : Int) = this.also { it.age = age }
        fun build() = Person(this.name!!, this.age!!)
    }
    companion object {
        @JvmStatic
        fun builder() = Builder()
    }
}

Kotlin・Javaからの呼び出し方

このdata classは、Kotlinからは冒頭と同様に下記の形でインスタンスを作成できますし、

Person(
  name = "taro",
  age = 20
)

Javaからはこのように呼ぶことができます。

Person.builder()
  .name("taro")
  .age(20)
  .build();

より良い書き方があるかもしれないので、ご存知の方はコメントなどでお知らせください。