Lombok Builder עם ערך ברירת מחדל

1. הקדמה

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

הקפד לבדוק גם את המבוא שלנו ללומבוק.

2. תלות

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

 org.projectlombok lombok 1.18.10 מסופק 

3. POJO עם בונה לומבוק

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

נתחיל ב- POJO פשוט:

מחלקה ציבורית Pojo {שם מחרוזת פרטי; מקורי בוליאני פרטי; }

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

נוסף על אלה, אנו רוצים בנאי לשיעור זה. עם Lombok, אנחנו יכולים לקבל את כל זה עם כמה הערות פשוטות:

@Getter @Builder @ NoArgsConstructor @ AllArgsConstructor כיתה ציבורית Pojo {שם מחרוזת פרטי; מקורי בוליאני פרטי; }

4. הגדרת ציפיות

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

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

@Test הציבור בטל givenBuilderWithDefaultValue_ThanDefaultValueIsPresent () {לבנות Pojo = Pojo.builder () .build (); Assert.assertEquals ("foo", build.getName ()); Assert.assertTrue (build.isOriginal ()); }

כמובן שמבחן זה נכשל מאז @בּוֹנֶה ביאור אינו מאכלס ערכים. נתקן זאת בקרוב.

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

@Test הציבור בטל givenBuilderWithDefaultValue_NoArgsWorksAlso () {לבנות Pojo = Pojo.builder () .build (); Pojo pojo = פוג'ו חדש (); Assert.assertEquals (build.getName (), pojo.getName ()); Assert.assertTrue (build.isOriginal () == pojo.isOriginal ()); }

בשלב זה מבחן זה עובר.

עכשיו בואו נראה איך נוכל לגרום לשני המבחנים לעבור!

5. של לומבוק Builder.Default ביאור

מאז Lombok v1.16.16, אנו יכולים להשתמש @בּוֹנֶהההערה הפנימית:

// הערות כיתתיות כמו לפני הכיתה הציבורית Pojo {@ Builder.Default שם פרטי מחרוזת = "foo"; @ Builder.Default מקורי בוליאני פרטי = נכון; }

זה פשוט וקריא, אבל יש לו כמה פגמים.

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

תופעת לוואי זו של Builder.Default ההערה קיימת מההתחלה וכנראה שהיא תהיה איתנו לאורך זמן.

6. אתחל את הבנאי

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

// הערות כיתתיות כמו לפני הכיתה הציבורית Pojo {שם פרטי מחרוזת = "foo"; מקורי בוליאני פרטי = נכון; מחלקה סטטית ציבורית PojoBuilder {private String name = "foo"; מקורי בוליאני פרטי = נכון; }}

בדרך זו, שני המבחנים יעברו.

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

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

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

// הערות כיתות כמו לפני @Builder (builderClassName = "PojoBuilder") מחלקה ציבורית Pojo {שם פרטי מחרוזת = "foo"; מקורי בוליאני פרטי = נכון; מחלקה סטטית ציבורית PojoBuilder {private String name = "foo"; מקורי בוליאני פרטי = נכון; }}

7. שימוש toBuilder

@בּוֹנֶה תומך גם ביצירת מופע של הבנאי ממופע של המחלקה המקורית. תכונה זו אינה מופעלת כברירת מחדל. אנו יכולים לאפשר זאת על ידי הגדרת ה- toBuilder פרמטר בהערת הקבלן:

// הערות כיתתיות כמו לפני @Builder (toBuilder = true) מחלקה ציבורית Pojo {שם פרטי מחרוזת = "foo"; מקורי בוליאני פרטי = נכון; }

עם זה, אנו יכולים להיפטר מהאתחול הכפול.

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

@Test ציבורי בטל givenBuilderWithDefaultValue_ThenDefaultValueIsPresent () {Pojo build = Pojo חדש (). ToBuilder () .build (); Assert.assertEquals ("foo", build.getName ()); Assert.assertTrue (build.isOriginal ()); } @Test ציבורי בטל givenBuilderWithDefaultValue_thenNoArgsWorksAlso () {Pojo build = Pojo חדש (). ToBuilder () .build (); Pojo pojo = פוג'ו חדש (); Assert.assertEquals (build.getName (), pojo.getName ()); Assert.assertTrue (build.isOriginal () == pojo.isOriginal ()); }

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

8. מסקנה

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

תופעת הלוואי של בּוֹנֶה.בְּרִירַת מֶחדָל ראוי לשים לב לביאור. אבל, גם לאפשרויות האחרות יש חסרונות. אז עלינו לבחור בקפידה על סמך המצב הקיים.

כמו תמיד, הקוד זמין ב- GitHub.


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