Menu
Coddy logo textTech

Veri Sınıfları

Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 32 / 57.

Veri sınıfı, temel görevi veri tutmak olan bir sınıftır. data değiştiricisi, derleyicinin birincil kurucunun özelliklerinden toString(), equals(), hashCode(), copy() ve componentN() işlevlerini oluşturmasını sağlar:

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

main içinde:

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

Çıktı:

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

data olmadan println, sınıf adını ve Point@1b6d3586 gibi bir hash kodunu gösterir ve aynı değerlere sahip iki nesne eşit değildir. copy(), bazı özellikleri değiştirilmiş yeni bir nesne oluşturur ve orijinali olduğu gibi bırakır; bu nedenle val özelliklerine sahip bir data sınıfı değişmez bir değer olarak çalışır:

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

main içinde:

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

Çıktı:

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

Yapısöküm bildirimleri bir nesneyi değişkenlere ayırır: val (x, y) = point, oluşturulan component1() ve component2() işlevlerini kurucunun sırasına göre çağırır. Bu işlem for döngülerinde ve lambda parametrelerinde de çalışır; _ ise bir özelliği atlar:

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

main içinde:

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")

Çıktı:

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

Yalnızca birincil kurucu özellikleri dikkate alınır: sınıf gövdesinde bildirilen bir özellik toString, equals, hashCode ve copy işlemlerine dahil edilmez. Bir veri sınıfının en az bir kurucu parametresi olmalıdır ve her parametre val veya var olmalıdır:

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

main içinde:

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

Çıktı:

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

Görev

Kolay

Book'u bir data class yapın, böylece değere göre yazdırılsın ve karşılaştırılsın. Sonra üç fonksiyonu tamamlayın: parse(line) Dune;Herbert;1965'i bir Book'a dönüştürür, newEdition(book, year) yeni yılla ve başlığa eklenen (new edition) ile bir kopya döndürür ve describe(book) bir destructuring declaration kullanarak Dune by Herbert, 1965 döndürür.

Sağlanan kod her girdi satırını ayrıştırır, her kitabı, yinelenenlerin sayısını, ilk kitabın yeni baskısını (yıl 2024) ve her benzersiz kitabın bir açıklamasını yazdırır.

Kodunuz Book.kt ve BookTools.kt dosyalarına yazılır. Main.kt sağlanan girdi/çıktı kodunu tutar ve düzenlenemez.

Kendin dene

fun main() {
    // Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
    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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Kotlin playground