הערות בטיחות אפסיות באביב

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

החל באביב 5, כעת יש לנו גישה לתכונה מעניינת המסייעת לנו לכתוב קוד בטוח יותר. תכונה זו נקראת null-safety, קבוצת הערות הפועלת כמו אמצעי הגנה המשגיח על הפניות פוטנציאליות לאפס.

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

2. ה @NonNull ביאור

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

נניח שיש לנו כיתה בשם אדם:

אדם בכיתה ציבורית {פרטי מחרוזת fullName; בטל setFullName (מחרוזת fullName) {אם (fullName! = null && fullName.isEmpty ()) {fullName = null; } this.fullName = fullName; } // גטר}

הגדרת כיתה זו תקפה, אך יש בה פגם - שם מלא שדה עשוי להיות מוגדר ל ריק. אם זה קורה, אנו עשויים לסיים NPE כשעובדים עם שם מלא.

תכונת האביב בטיחות באביב מאפשרת כלים לדווח על סכנה כזו. למשל, אם נכתוב קוד ב- IntelliJ IDEA ונקשט את ה- שם מלא שדה עם @NonNull ביאור, נראה אזהרה:

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

3. ה @NonNullFields ביאור

ה @NonNull ביאור מועיל להבטחת ביטחון בטל. עם זאת, נזהם את כל בסיס הקוד אם מעטר את כל השדות שאינם אפסים עם ההערה הזו.

אנו יכולים למנוע ניצול לרעה של @NonNull עם הערה נוספת - @NonNullFields. הערה זו חלה ברמת החבילה, ומודיעה לכלי הפיתוח שלנו שכל השדות בחבילה המאושרת הם, כברירת מחדל, אינם ריקים.

בשביל ה @NonNullFields ביאור לבעוט פנימה, עלינו ליצור קובץ בשם package-info.java בספריית הבסיס של החבילה והערת את החבילה באמצעות @NonNullFields:

חבילת @NonNullFields org.baeldung.nullibility;

בואו נכריז על נכס אחר ב אדם כיתה, נקרא כינוי:

חבילה org.baeldung.nullibility; // הצהרות ייבוא ​​אדם בכיתה ציבורית {כינוי פרטי מחרוזת בטל setNickName (@Nullable מחרוזת nickname) {אם (nickName! = null && nickName.isEmpty ()) {nickName = null; } this.nickName = nickname; } // הצהרות אחרות}

הפעם, אנחנו לא מייפים את כינוי שדה עם @NonNull אבל עדיין רואה אזהרה דומה:

ה @NonNullFields ההערה הופכת את הקוד שלנו לפחות מילולי תוך הקפדה על אותה רמת בטיחות @NonNull מספק.

4. ה @מאפשרת ערכי null ביאור

ה @NonNullFields ביאור עדיף בדרך כלל על @NonNull מכיוון שהוא מסייע בהפחתת הדוד. לעיתים אנו רוצים לפטור כמה שדות מהאילוץ שאינו אפס שצוין ברמת החבילה.

בוא נחזור ל כינוי שדה פנימה ולקשט אותו עם @מאפשרת ערכי null ביאור:

@Nullable פרטי מחרוזת nickname;

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

במצב הזה, השתמשנו ב- @מאפשרת ערכי null ביאור לביטול הסמנטיקה של @NonNullFields על שדה.

5. ה @NonNullApi ביאור

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

כמו עם @NonNullFields, עלינו לציין את @NonNullApi ביאור ב package-info.java קוֹבֶץ:

חבילת @ NonNullApi org.baeldung.nullibility;

בואו נגדיר גטר עבור ה- כינוי שדה:

חבילה org.baeldung.nullibility; // הצהרות ייבוא ​​אדם מחלקה ציבורית {@ Nullable private String nickname; מחרוזת getNickName () {return nickName; } // הצהרות אחרות}

עם ה @NonNullApi ביאור למעשה, ניתנת אזהרה לגבי אפשרות ריק ערך המיוצר על ידי getNickName שיטה:

שימו לב בדיוק כמו ה- @NonNullFields ביאור, אנו יכולים לעקוף את @NonNullApi ברמת השיטה עם @מאפשרת ערכי null ביאור.

6. מסקנה

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

  • ניתן להשתמש בו רק בכלי פיתוח תומך, כגון IntelliJ IDEA
  • זה לא אוכף ריק בודק בזמן ריצה - אנחנו עדיין צריכים לכתוב קוד בעצמנו כדי למנוע NPE

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


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