Menu
Coddy logo textTech

init Blokları ve Doğrulama

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

Bir init bloğu, bir örnek oluşturulduğunda, kurucu parametreleri atandıktan hemen sonra çalışır. Tek bir özellik bildirimine sığmayan kurulum kodları için kullanılır:

class Order(val id: Int, items: List<Int>) {
    val total: Int
    val count: Int

    init {
        total = items.sum()
        count = items.size
        println("created order $id")
    }
}

main içinde:

val o = Order(7, listOf(4, 6, 10))
println("${o.count} items, total ${o.total}")

Çıktı:

created order 7
3 items, total 20

require(condition) { message } bir bağımsız değişkeni kontrol eder ve değer yanlış olduğunda mesajla birlikte IllegalArgumentException fırlatır. Bunu init içine koymak, geçersiz bir örneğin hiçbir zaman oluşturulamamasını sağlar:

class Percentage(val value: Int) {
    init {
        require(value in 0..100) { "percentage must be 0-100, was $value" }
    }
}

main içinde:

println(Percentage(42).value)
try {
    Percentage(150)
} catch (e: IllegalArgumentException) {
    println(e.message)
}

Çıktı:

42
percentage must be 0-100, was 150

Bir sınıfın birden fazla init bloğu olabilir; bunlar özellik başlatıcılarıyla birlikte yukarıdan aşağıya sırayla çalışır:

class Demo(name: String) {
    val first = "first: $name".also { println(it) }

    init { println("init 1") }

    val second = "second".also { println(it) }

    init { println("init 2") }
}

main içinde:

Demo("x")
println("done")

Çıktı:

first: x
init 1
second
init 2
done

init içindeki doğrulama, kuralı verilerin yanında tutar. Bir örnek alan kod, tekrar kontrol etmeden ona güvenebilir:

class Email(val address: String) {
    init {
        require("@" in address) { "not an email: $address" }
    }
}
fun send(to: Email) { /* adresi tekrar kontrol etmeye gerek yok */ }
challenge icon

Görev

Kolay

Password sınıfını tamamla. init bloğu, require ile text değerinin en az 8 karakter içerdiğini (mesaj too short) ve bir rakam içerdiğini (mesaj needs a digit) bu sırayla kontrol eder. strength özelliği init içinde hesaplanır: text ayrıca bir büyük harf içeriyorsa strong, aksi takdirde ok olur.

Sağlanan kod, her girdi satırı için bir Password oluşturur ve strength değerini veya hata mesajını yazdırır.

Kodun Password.kt dosyasına yazılmalıdır. Main.kt sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

fun main() {
    // Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
    val input = generateSequence(::readLine).toList()
    for (line in input) {
        try {
            println(Password(line).strength)
        } catch (e: IllegalArgumentException) {
            println(e.message)
        }
    }
}
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