Kotlinにおけるclassとdata classの違いについてまとめました。
目次
data classとは
data classはKotlin特有の仕様で、データを保持するだけのクラスはdataマークをつけることで定義されます。
data classとは特に何かしらの処理を行うわけではないが、データだけ持っているクラスを作ることができます。つまり、データだけを持ったクラスが生成できます。
data classとして成り立たせるには、最低1つのプライマリコンストラクタ引数を持たせる必要があります。
1 2 3 | data class hoge() // Data class must have at least one primary constructor parameter |
また、valやvarでイミュータブルかどうかを明示すること、抽象クラスやopenクラス、sealedクラスやinnerクラスでないことが必要です。
data classの実装
data classは、dataという修飾子をclassの前につけるだけでdata classとして扱われます。
1 | data class User(val userId: number, val name: String) |
data classとclassの違い
data classとclassの違いは、data classの方はデータを扱うのに便利なメソッドが自動で実装されます。
元々全クラスの継承元、Anyクラスが持つ
- toString: 型名とプロパティ名、値を文字列として返す
- hashCode: プロパティの値に基づくハッシュ値を返す
- equals: オブジェクトの同値性を調べ、Booleanを返す
data classは上記に加え、以下が実装されています。
- copy: オブジェクトのコピーを返す
- componentN: N番目のプロパティの値を返す
data classで使えるcopyメソッドとcomponentNメソッド
copyメソッド
copyメソッドを使うことで同値の別インスタンスを生成できます。その際プロパティの値を変更することができます。
「プロパティの一部だけ値を変更して、新たなオブジェクトを作る」といった場合はcopyを使うと、全てのプロパティを入力せずに済みます。
例としてcopyメソッドを使って、nameプロパティのみ変更したインスタンスを作成します。
1 2 3 4 5 6 7 8 9 10 | data class Department(val name: String, val address: String, val phoneNumber: String) val department = Department("品質管理", ”東京都”, “090-1111-2222”) val changedDepartment = department.copy(name = "生産管理") println(changedDepartment.name) // 生産管理 println(changedDepartment.address) // 東京都 |
componentNメソッド
クラスに宣言したプロパティにcomponent1、component2…でアクセスすることができます。
1 2 3 4 5 6 7 8 9 10 11 12 | data class Department(val name: String, val address: String, val phoneNumber: String) val department = Department("品質管理", ”東京都”, “090-1111-2222”) val first = department.component1() val second = department.component2() println(first) // 品質管理 println(second) // 東京都 |