Menu
CoddyTech

Data class

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 32 dari 57.

data class adalah class yang tugas utamanya menyimpan data. Modifier data membuat compiler menghasilkan toString(), equals(), hashCode(), copy() dan componentN() dari property konstruktor utama:

data class Point(val x: Int, val y: Int)

Di dalam main:

val a = Point(1, 2)
val b = Point(1, 2)
println(a)
println(a == b)
println(setOf(a, b).size)

Output:

Point(x=1, y=2)
true
1

Tanpa data, println menampilkan nama class dan kode hash seperti Point@1b6d3586, dan dua object dengan nilai yang sama tidak dianggap setara. copy() membuat object baru dengan beberapa property yang diubah dan membiarkan object asli tetap seperti semula, sehingga data class dengan property val berfungsi sebagai nilai yang tidak dapat diubah:

data class User(val name: String, val email: String, val admin: Boolean = false)

Di dalam main:

val ada = User("Ada", "ada@example.com")
val boss = ada.copy(admin = true)
println(ada)
println(boss)
println(ada == boss)

Output:

User(name=Ada, email=ada@example.com, admin=false)
User(name=Ada, email=ada@example.com, admin=true)
false

Deklarasi destructuring membongkar object menjadi beberapa variabel: val (x, y) = point memanggil component1() dan component2() yang dihasilkan, sesuai urutan constructor. Fitur ini juga berfungsi dalam for loop dan parameter lambda, sedangkan _ melewati sebuah property:

data class Score(val player: String, val points: Int, val level: Int)

Di dalam main:

val scores = listOf(Score("ada", 120, 3), Score("bo", 95, 2))
for ((player, points) in scores) println("$player: $points")
val (_, bestPoints, bestLevel) = scores.maxBy { it.points }
println("best: $bestPoints at level $bestLevel")

Output:

ada: 120
bo: 95
best: 120 at level 3

Hanya property konstruktor utama yang disertakan: property yang dideklarasikan di dalam badan class tidak disertakan dalam toString, equals, hashCode, dan copy. Data class memerlukan setidaknya satu parameter konstruktor, dan setiap parameter harus berupa val atau var:

data class Reading(val sensor: String, val value: Int) {
    var note = ""
}

Di dalam main:

val r1 = Reading("t1", 20)
val r2 = Reading("t1", 20)
r1.note = "checked"
println(r1)
println(r1 == r2)

Output:

Reading(sensor=t1, value=20)
true
challenge icon

Tantangan

Mudah

Jadikan Book sebagai data class agar pencetakan dan perbandingannya berdasarkan nilai. Lalu lengkapi tiga fungsi: parse(line) mengubah Dune;Herbert;1965 menjadi Book, newEdition(book, year) mengembalikan salinan dengan tahun baru dan (new edition) ditambahkan ke judul, dan describe(book) mengembalikan Dune by Herbert, 1965 menggunakan deklarasi destrukturisasi.

Kode yang disediakan mengurai setiap baris input, mencetak setiap buku, jumlah duplikat, edisi baru dari buku pertama (tahun 2024), dan deskripsi setiap buku yang berbeda.

Tulis kodemu di Book.kt dan BookTools.kt. Main.kt berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan apa adanya
    val input = generateSequence(::readLine).toList()
    val books = input.map { parse(it) }
    for (b in books) println(b)
    println("duplicates: ${books.size - books.distinct().size}")
    println(newEdition(books[0], 2024))
    for (b in books.distinct()) println(describe(b))
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Kotlin