Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

data class

Kotlinの『data class』は、データ保持に特化したクラスです。『equals()』『hashCode()』『toString()』『copy()』『componentN()』が自動生成されます。値オブジェクトやDTOの実装に最適です。

構文
// data class の定義(プライマリコンストラクターにプロパティが必要)
data class Point(val x: Int, val y: Int)

// インスタンス生成
val p = Point(3, 4)

// 自動生成されるメソッド
p.toString()  // "Point(x=3, y=4)"
p.copy(x = 10)  // Point(x=10, y=4)
val (x, y) = p  // 分割宣言(destructuring)

// equals は値の比較になります。
Point(1, 2) == Point(1, 2)  // true
メソッド一覧
メソッド/機能概要
toString()「クラス名(プロパティ名=値, ...)」の形式で文字列化します。
equals(other)プロパティの値をすべて比較します(== で使われます)。
hashCode()プロパティ値に基づくハッシュコードを返します。
copy(プロパティ名 = 値)一部のプロパティを変更した新しいインスタンスを生成します。
component1(), component2(), ...分割宣言(val (a, b) = obj)で使われる自動生成メソッドです。
サンプルコード
// データクラスの定義
data class User(
    val id: Int,
    val name: String,
    val email: String,
    val age: Int = 0  // デフォルト値も使えます。
)

data class Point(val x: Double, val y: Double) {
    // data class にメソッドを追加できます。
    fun distanceTo(other: Point): Double {
        val dx = x - other.x
        val dy = y - other.y
        return Math.sqrt(dx * dx + dy * dy)
    }
}

fun main() {
    val user1 = User(1, "Alice", "alice@example.com", 30)
    val user2 = User(1, "Alice", "alice@example.com", 30)
    val user3 = User(2, "Bob", "bob@example.com")

    // toString() — デバッグに便利です。
    println(user1)  // User(id=1, name=Alice, email=alice@example.com, age=30)

    // equals() — 値の比較
    println(user1 == user2)  // true(同じ値)
    println(user1 == user3)  // false

    // copy() — 一部だけ変更します。
    val updatedUser = user1.copy(age = 31, email = "alice_new@example.com")
    println(updatedUser)
    println(user1)  // 元は変わりません(不変)

    // 分割宣言(componentN)
    val (id, name, email) = user1
    println("ID: $id, 名前: $name, メール: $email")

    // リストでの活用
    val users = listOf(user1, user3, User(3, "Carol", "carol@example.com", 25))
    val sortedUsers = users.sortedBy { it.name }
    sortedUsers.forEach { println("${it.name} (${it.age}歳)") }

    // Point のメソッド呼び出し
    val p1 = Point(0.0, 0.0)
    val p2 = Point(3.0, 4.0)
    println("距離: ${p1.distanceTo(p2)}")  // 5.0

    // コピーで一部変更
    val p3 = p1.copy(x = 1.0)
    println("コピー: $p3")  // Point(x=1.0, y=0.0)
}
概要

『data class』はKotlinでDDD(ドメイン駆動設計)の値オブジェクトやAPIのレスポンスモデルを実装する際に非常に便利です。Javaでは100行近くになるコードが1行で書けます。

注意: data classのプライマリコンストラクターには少なくとも1つのプロパティが必要です。また、data classは自動で『open』にはならないため継承には使えません(継承したい場合は通常の『class』を使います)。

クラスの基本構造はclass / コンストラクターを、型の制限付き継承はsealed class / sealed interfaceを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。