KotlinDive

プログラミング言語 Kotlin についての入門ブログです。

クラス(データクラス)

Data Transfer Object

アプリを作成していると、単純にひとまとまりのデータを保持しておきたい場合があります。 たとえば、データベースから関連するデータを取り出して(いはゆるモデル層)、画面に表示する(いわゆるビュー層)場合などです。 このように、モデルやビューなどのことなるレイヤーの間でデータを受け渡しするのに利用するオブジェクトを「Data Transfer Object」と呼びます。
Kotlinでは、このようにデータを保持することを目的としたクラスを簡単に作成することができます。 これを、「データクラス」と呼びます。

データクラス

それでは、データクラスを実際に宣言してみましょう。 データクラスを宣言するためには、classの前に「data」をつけます。
また、データクラスは次の条件を満たしている必要があります。

  • プライマリコンストラクタに一つ以上のパラメータがある
  • プライマリコンストラクタのパラメータには「val」か「var」を指定する
  • 「abstract」「open」「inner」「sealed」ではない

fun main(args: Array) {
    var student = Student("suzuki", 82.1)
    println(student.toString())
}

data class Student(val name: String, var score: Double)

Student(name=suzuki, score=82.1)

上記のサンプルのように、データクラスは次のメンバーを自動で生成します。

  • equals()
  • hashCode()
  • toString()
  • copy()
  • componentN()

「componentN()」関数は、宣言順のプロパティに相当します。 例えば、上記のサンプルの「Student」クラスでは、component1()がnameプロパティ、component2()がscoreプロパティに当たります。

「copy()」関数は、上記のサンプルを例にとると次のように宣言されています。


fun copy(name: Stirng = this.name, score: Double = this.score) = Student(name, score) 

そのため、コピーをするときにパラメータを指定することで、必要に応じてパラメータの一部を変更してコピーすることができます。


fun main(args: Array) {
    var student = Student("suzuki", 82.1)
    println(student.toString())

    var student2 = student.copy(name = "tanaka")
    println(student2.toString())
}

data class Student(val name: String, var score: Double) {
    // copyは、具体的には以下のように自動実装される
    // すでに実装されているので、コメントを外すとビルドエラーになる
    // fun copy(name: Stirng = this.name, score: Double = this.score) = Student(name, score)
}

Student(name=suzuki, score=82.1)
Student(name=tanaka, score=82.1)