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 20require(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 150Sebuah 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
doneValidasi 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 */ }Tantangan
MudahLengkapi 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)
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classKonstruktor utamaBlok init dan validasiKonstruktor sekunderRingkasan: Kartu Perpustakaan2property dan Enkapsulasi
Accessor KustomModifier VisibilitasSetter Privatlazy dan lateinitRingkasan: Rekening Bank5Interface
Mendeklarasikan Interfacemethod DefaultBeberapa InterfaceInterface sebagai TipeUlasan: Metode Pembayaran11Proyek: Pengelolaan Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Kotlin