Menu
CoddyTech

Blok init dan validasi

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

Blok init berjalan saat sebuah instance dibuat, tepat setelah parameter constructor ditetapkan. Blok ini menjadi tempat untuk kode penyiapan yang tidak cocok dimasukkan ke dalam satu deklarasi property:

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

Di dalam main:

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

Output:

created order 7
3 items, total 20

require(condition) { message } memeriksa argumen dan melempar IllegalArgumentException dengan pesan saat kondisi bernilai false. Menempatkannya di init berarti instance yang tidak valid tidak akan pernah bisa dibuat:

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

Di dalam main:

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

Output:

42
percentage must be 0-100, was 150

Sebuah class dapat memiliki beberapa blok init; semuanya dijalankan secara berurutan, bersama dengan inisialisasi property, dari atas ke bawah:

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

Di dalam main:

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

Output:

first: x
init 1
second
init 2
done

Validasi di init menjaga aturan tetap dekat dengan data. Kode yang menerima sebuah instance bisa memercayainya tanpa memeriksanya lagi:

class Email(val address: String) {
    init {
        require("@" in address) { "not an email: $address" }
    }
}
fun send(to: Email) { /* tidak perlu memeriksa alamatnya lagi */ }
challenge icon

Tantangan

Mudah

Lengkapi class Password. Blok init-nya memeriksa dengan require bahwa teks memiliki setidaknya 8 karakter (pesan too short) dan berisi angka (pesan needs a digit), dalam urutan tersebut. Property strength dihitung di init: strong jika teks juga berisi huruf besar, jika tidak, ok.

Kode yang disediakan membuat Password untuk setiap baris input dan mencetak strength atau pesan error.

Kodemu ditulis di Password.kt. Main.kt berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

fun main() {
    // Kode input/output sudah disediakan: biarkan apa adanya
    val input = generateSequence(::readLine).toList()
    for (line in input) {
        try {
            println(Password(line).strength)
        } catch (e: IllegalArgumentException) {
            println(e.message)
        }
    }
}
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