בלוקי 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 20require(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) { /* אין צורך לבדוק שוב את הכתובת */ }אתגר
קלהשלם את המחלקה 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)
}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מחלקות ואובייקטים
עבודה עם קבציםהגדרת מחלקותבנאים ראשייםבלוקי init ואימות נתוניםבנאים משנייםסיכום – כרטיס ספרייהתרגלו בעצמכם: Kotlin אונליין