מדריך מקיף לבטיחות אפסית בקוטלין

1. סקירה כללית

במאמר זה נבחן את תכונות הבטיחות האפסיות המובנות בשפת קוטלין. Kotlin מספק טיפול מקיף מקומי בשדות בטלים - אין צורך בספריות נוספות.

2. תלות של Maven

כדי להתחיל, יהיה עליך להוסיף את ה- קוטלין-סטדליב תלות Maven שלך pom.xml:

 org.jetbrains.kotlin kotlin-stdlib 1.1.1 

תוכל למצוא את הגרסה האחרונה ב- Maven Central.

3. סוגי הפניה שאינם ניתנים לביטול ולא ניתן לביטול

לקוטלין שני סוגים של הפניות המתפרשים על ידי המהדר בכדי לתת למתכנת מידע על נכונותה של תוכנית בזמן הקומפילציה - אלה שאינם ניתנים לביטול ואלה שאינם.

כברירת מחדל, קוטלין מניח שערך אינו יכול להיות ריק:

var a: String = "value" assertEquals (אורך, 5)

אנחנו לא יכולים להקצות ריק להתייחסות א, ואם תנסה, זה יגרום לשגיאת מהדר.

אם אנו רוצים ליצור הפניה בטלה, עלינו ליצור להוסיף את סימן השאלה (?) להגדרת הסוג:

var b: מחרוזת? = "ערך"

לאחר מכן, אנו יכולים להקצות ריק לזה:

b = null

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

אם (b! = null) {println (b.length)} אחר {assertNull (b)}

4. שיחות בטוחות

טיפול בכל התייחסות בטלה בצורה כזו עשוי להיות מסורבל. למרבה המזל, לקוטלין יש תחביר ל"שיחות בטוחות "- תחביר זה מאפשר למתכנתים לבצע פעולה רק כאשר הפניה הספציפית מחזיקה בערך שאינו אפס.

בואו נגדיר שתי מחלקות נתונים להמחשת תכונה זו:

מחלקת נתונים אדם (מדינה val: מדינה?) מחלקת נתונים מדינה (קוד val: מחרוזת?)

שים לב שה- מדינה ו קוד שדות הם מסוג ייחוס בטל.

כדי לגשת לשדות אלה בצורה שוטפת, אנו יכולים להשתמש בתחביר השיחה הבטוחה:

val p: אדם? = אדם (מדינה ("ENG")) val res = p? .Country? .Code assertEquals (res, "ENG")

צריך המשתנה עמ ' תחזיק ריקתחביר השיחות הבטוחות יחזיר א ריק תוֹצָאָה:

val p: אדם? = אדם (מדינה (null)) val res = p? .Country? .Code assertNull (res)

4.1. שיטת let ()

כדי לבצע פעולה רק כאשר הפניה מחזיקה בערך שאינו בטל, אנו יכולים להשתמש ב- לתת מַפעִיל.

בואו נגיד שיש לנו רשימת ערכים ויש גם ריק ערך ברשימה זו:

val firstName = "Tom" val secondName = "Michael" val names: List = listOf (firstName, null, secondName)

לאחר מכן, אנו יכולים לבצע פעולה על כל רכיב שאינו מבוטל של ה- שמות רשימה באמצעות לתת פוּנקצִיָה:

var res = listOf () עבור (פריט בשמות) {item? .let {res = res.plus (it)}} assertEquals (2, res.size) assertTrue {res.contains (firstName)} assertTrue {res.contains (שם שני) }

4.2. שיטת גם ()

אם אנחנו רוצים כדי להחיל פעולה נוספת כלשהי, למשל כניסה לכל ערך שאינו בטל בו אנו יכולים להשתמש גַם()השיטה ולשרשר אותה עם לתת():

var res = listOf () עבור (פריט בשמות) {item? .let {res = res.plus (it); זה}?. גם {it -> println ("ערך לא מבוטל: $ it")}}

זה ידפיס כל אלמנט שאינו ריק:

ערך לא מבוטל: טום ערך לא מבוטל: מייקל

4.3. שיטת הריצה ()

לקוטלין יש לָרוּץ() שיטה לביצוע פעולה כלשהי בהפניה בטלה. זה מאוד דומה ל לתת() אך בתוך גוף פונקציה, שיטת הריצה () פועל הלאה זֶה הפניה במקום פרמטר פונקציה:

var res = listOf () עבור (פריט בשמות) {item? .run {res = res.plus (this)}}

5. מפעיל אלביס

לפעמים, כשיש לנו הפניה, אנחנו רוצים להחזיר ערך ברירת מחדל מהפעולה אם הפניה מחזיקה a ריק. כדי להשיג זאת, אנו יכולים להשתמש ב- אלביס (?:) מפעיל. זה שווה ערך ל- orElse / orElseGet מג'אווה אופציונאלי מעמד:

ערך val: מחרוזת? = null val res = value? .length?: -1 assertEquals (res, -1)

כאשר ערך הפניה מחזיקה בערך שאינו מבוטל, השיטה אורך יופעל:

ערך val: מחרוזת? = "שם" val res = value? .length?: -1 assertEquals (res, 4)

6. בטל לא בטוח Get Get

לקוטלין יש גם מפעיל לא בטוח להשיג ערך של שדה בטל מבלי לטפל במפורש בהיגיון היעדר, אך יש להשתמש בזהירות רבה.

מפעיל סימן הקריאה הכפול (!!) לוקח ערך מהפניה בטלה וזורק a NullPointerException אם זה מתקיים ריק. זה שווה ערך ל- Optional.get () מבצע:

var b: מחרוזת? = "value" b = null assertFailsWith {b !! }

אם הפניה לביטול מחזיקה בערך שאינו בטל, הפעולה בערך זה תבוצע בהצלחה:

val b: מחרוזת? = "value" assertEquals (b !!. אורך, 5)

7. סינון ערכים אפסים מרשימה

ה רשימה בכיתה בקוטלין יש שיטת שימוש filterNotNull () שמחזירה רק ערכים שאינם ניתנים לביטול מרשימה המכילה הפניות לביטול:

val list: List = listOf ("a", null, "b") val res = list.filterNotNull () assertEquals (res.size, 2) assertTrue {res.contains ("a")} assertTrue {res.contains ( "ב")}

זהו מבנה שימושי מאוד העוטף את ההיגיון שאחרת נצטרך ליישם בעצמנו.

8. מסקנה

במאמר זה בחנו לעומק את מאפייני הבטיחות האפסיים של קולטין. ראינו סוגי הפניות שיכולים להחזיק ריק ערכים ואלו שלא יכולים. יישמנו שוטף ריק טיפול בהיגיון באמצעות תכונות "שיחה בטוחה" ו אלביס מַפעִיל.

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד בפרויקט GitHub - זהו פרויקט Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


$config[zx-auto] not found$config[zx-overlay] not found