Menu
Coddy logo textTech

בלוקי init ואימות נתונים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Kotlin של Coddy. שיעור 4 מתוך 57.

בלוק init מופעל כשנוצר מופע, מיד אחרי שהפרמטרים של הבנאי מקבלים ערכים. זהו המקום לקוד אתחול שלא מתאים להצהרה של מאפיין יחיד:

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:

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

פלט:

created order 7
3 items, total 20

require(condition) { message } בודקת ארגומנט וזורקת IllegalArgumentException עם ההודעה כשהתנאי אינו מתקיים. הצבתה בתוך init פירושה שלעולם לא ניתן ליצור מופע לא תקין:

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

בתוך main:

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

פלט:

42
percentage must be 0-100, was 150

למחלקה יכולים להיות כמה בלוקי init; הם רצים לפי הסדר, יחד עם אתחולי המאפיינים, מלמעלה למטה:

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:

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

פלט:

first: x
init 1
second
init 2
done

אימות ב-init מציב את הכלל לצד הנתונים. קוד שמקבל מופע יכול לסמוך עליו בלי לבדוק שוב:

class Email(val address: String) {
    init {
        require("@" in address) { "not an email: $address" }
    }
}
fun send(to: Email) { /* אין צורך לבדוק שוב את הכתובת */ }
challenge icon

אתגר

קל

השלם את המחלקה Password. בלוק init שלה בודק, באמצעות require, שהטקסט מכיל לפחות 8 תווים (ההודעה too short) ושיש בו ספרה (ההודעה needs a digit), בסדר הזה. המאפיין strength מחושב ב-init: strong כשהטקסט מכיל גם אות גדולה, אחרת ok.

הקוד שסופק יוצר Password עבור כל שורת קלט ומדפיס את strength או את הודעת השגיאה.

הקוד שלך צריך להיכתב ב-Password.kt. הקובץ Main.kt מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

fun main() {
    // קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
    val input = generateSequence(::readLine).toList()
    for (line in input) {
        try {
            println(Password(line).strength)
        } catch (e: IllegalArgumentException) {
            println(e.message)
        }
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Kotlin אונליין