Framework Checker - מערכות מסוג Pluggable עבור Java

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

מ ה ג'אווה 8 שחרור ואילך, ניתן להרכיב תוכניות באמצעות מה שמכונה מערכות מסוג תקע - שיכולים להחיל בדיקות מחמירות יותר מאלו שהחובר המהדר.

עלינו להשתמש רק בהערות שמספקות מספר מערכות מסוג תקע זמין.

במאמר מהיר זה, נחקור מסגרת בודק, באדיבות אוניברסיטת וושינגטון.

2. מייבן

כדי להתחיל לעבוד עם Framework Checker, עלינו להוסיף אותה תחילה pom.xml:

 org.checkerframework checker-qual 2.3.2 org.checkerframework checker 2.3.2 org.checkerframework jdk8 2.3.2 

ניתן לבדוק את הגרסה האחרונה של הספריות ב- Maven Central.

שתי התלות הראשונות מכילות את הקוד של מסגרת בודק ואילו האחרון הוא גרסה מותאמת אישית של ה- ג'אווה 8 מחלקות, בהן כל הסוגים הוסרו כראוי על ידי מפתחי מסגרת בודק.

לאחר מכן עלינו לכוונן כראוי את תוסף maven-compiler להשתמש מסגרת בודק כמתקבל הקלד מערכת:

 maven-compiler-plugin 3.6.1 1.8 1.8 10000 10000 org.checkerframework.checker.nullness.NullnessChecker org.checkerframework.checker.interning.InterningChecker org.checkerframework.checker.fenum.FenumChecker org.checkerframework.checker.formatter.FormatterChecker -AprintErrorStack -זהרות 

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

3. הימנעות מ- NullPointerExceptions

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

count intag פרטי סטטי פרטי (@NonNull String [] args) {return args.length; } ראשי ריק סטטי ציבורי (@Nullable String [] args) {System.out.println (countArgs (args)); }

בדוגמה שלעיל הכרזנו עם ה- @NonNull ביאור כי טוען טיעון של countArgs () חייב להיות לא אפס.

ללא קשר לאילוץ זה, ב רָאשִׁי()אנו קוראים לשיטה המעבירה טיעון שאכן יכול להיות בטל מכיוון שהוא הועלה עם הערות @מאפשרת ערכי null.

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

[אזהרה] / checker-plugin/.../NonNullExample.java: [12,38] [argument.type.incompatible] סוגים לא תואמים בטיעון. נמצא: חובה null: @Initialized @NonNull מחרוזת @Initialized @NonNull []

4. שימוש נכון בקבועים כמניינים

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

נניח שאנחנו צריכים סדרה של מדינות וכוכבי לכת. לאחר מכן נוכל להוסיף הערות לפריטים אלה באמצעות ה- @Fenum ביאור לקבץ כל הקבועים שהם חלק מאותה ספירה "מזויפת":

גמר סטטי @Fenum ("מדינה") מחרוזת איטליה = "IT"; גמר סטטי @Fenum ("מדינה") מחרוזת ארה"ב = "ארה"ב"; גמר סטטי @Fenum ("מדינה") מחרוזת UNITED_KINGDOM = "בריטניה"; גמר סטטי @Fenum ("כוכב לכת") מחרוזת MARS = "מאדים"; גמר סטטי @Fenum ("כוכב לכת") מחרוזת EARTH = "כדור הארץ"; גמר סטטי @Fenum ("כוכב לכת") מחרוזת VENUS = "ונוס";

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

חלל greetPlanet (@Fenum ("כוכב לכת") כוכב מחרוזת) {System.out.println ("שלום" + כוכב לכת); }

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

ראשי סטטי ציבורי ריק (String [] args) {obj.greetPlanets (US); }

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

[אזהרה] / checker-plugin/.../FakeNumExample.java: [29,26] [argument.type.incompatible] סוגים לא תואמים בטיעון. נמצא: @Fenum ("מדינה") מחרוזת חובה: @Fenum ("כוכב לכת") מחרוזת

5. ביטויים רגילים

נניח שאנחנו יודעים א חוּט המשתנה צריך לאחסן ביטוי רגולרי עם קבוצה תואמת אחת לפחות.

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

@Regex (1) מחרוזת סטטית פרטית FIND_NUMBERS = "\ d *";

ברור שזו שגיאה אפשרית מכיוון שהביטוי הרגיל שהקצנו לו FIND_NUMBERS אין קבוצה תואמת.

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

[אזהרה] / check-plugin/.../RegexExample.java: [7,51] [assignment.type.incompatible] סוגים שאינם תואמים במשימה. נמצא: @Regex מחרוזת חובה: @Regex (1) מחרוזת

6. מסקנה

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

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

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

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