פונקציונליות משותפת של Java Object עם Project Lombok

Project Lombok היא ספרייה קטנה שניתן להשתמש בה כדי להפחית את כמות קוד הג'אווה של הדוד הנכתב בדרך כלל לשיעורי Java. Project Lombok עושה זאת באמצעות ביאורים שניתן להוסיף למחלקת Java שעבורה רוצים שיטות נפוצות. רוב ההערות מתארות את עצמן בשמותיהן: @Getter, @Setter, @EqualsAndHashCode, @ToString ו- @NoArgsConstructor הם דוגמאות. בפוסט זה, אני מדגים את השימוש בהערות פשוטות של Lombok כדי להוסיף את השיטות הכתובות הנפוצות לשיעור Java.

הנה מחלקה פשוטה ללא גרסה מוגדרת מראש של toString ().

Person.java ללא מחרוזת

package dustin.examples; /** * Simple Person class without boilerplate. * * @author Dustin */ public class Person { private String lastName; private String firstName; } 

כאשר נוצרת המחלקה הנ"ל ומתקבלת שיטת הירושה שלה (מאובייקט) ל- String (), הפלט נראה כמו זה שמוצג בתמונה הבאה.

נוכל לכתוב שיטת מפורשת toString () או להשתמש ב- Project Lombok. קטע הקוד הבא מדגים את גישת Project Lombok.

Person.java עם ההערה @ToString של לומבוק

package dustin.examples; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString public class Person { private String lastName; private String firstName; } 

הפלט מהדפסת תוכן מחלקה זו באמצעות ToString שמסופק ב- Lombok () מוצג בהמשך.

יש ייצוג טוב יותר ל- String () של אובייקט ה- Person כעת, אך השדות שלו עדיין אינם מאותחלים, ולכן אנו רואים רק ערכי null. נוכל להשתמש בלומבוק שוב כדי ליצור את הבנאי.

Person.java עם ההערה של לומבוק @ AllArgsConstructor

package dustin.examples; import lombok.AllArgsConstructor; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor public class Person { private String lastName; private String firstName; } 

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

מחלקה כמו Person.java היא לעיתים קרובות מחלקת נתונים שתצטרך להשתמש בה בהשוואות ואולי גם במקשי איסוף מבוססי hashCode. חשוב ליצור יישומים שווים (Object) ו- hashCode () ולוודא שהם נוצרים יחד. מכיוון שישנן שווי ברירת מחדל ושיטות hashCode המסופקות על ידי מחלקת אובייקט האב, קוד Java באמצעות מופעי Person יוכל לבצע שווה ו / או hashCode, אך סביר להניח שהם אינם מה שאנשים באמת רוצים. כאשר מחלקת ההפעלה הראשית משתנה לרישום הקוד הבא, אנו רואים את הפלט אחרי זה שאומר לנו כי השוואת השוויון נעשית לחלוטין על בסיס זהות ולא על תוכן.

Main.java שמבדק שווה ליישום ()

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } } } 

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

Person.java עם @EqualsAndHashCode

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { private String lastName; private String firstName; } 

התפוקה טובה יותר כעת.

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

לדוגמא זו, נניח שהנחנו פגומה שרק שם המשפחה של האדם עשוי להשתנות. בגלל הנחה זו, אנו נספק רק הערת Lombok @Setter עבור שם המשפחה, אך נספק הערה @ Getter עבור שני השדות. קוד האדם ששונה מוצג בהמשך.

Person.java עם @ Getter ו- @ Set

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { @Getter @Setter private String lastName; @Getter private String firstName; } 

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

Main.java המשתמשת בסט / גטר חדש

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } final Person accessiblePerson = new Person("Garzminski", "Gary"); out.println("The last name is " + accessiblePerson.getLastName()); out.println("The first name is " + accessiblePerson.getFirstName()); //accessiblePerson.setFirstName("Grady"); accessiblePerson.setLastName("Garfunkel"); out.println("The new last name is " + accessiblePerson.getLastName()); } } 

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

סביר להניח שאוסף זה של הערות לומבוק יהיה רצוי בדרך כלל, במיוחד עבור שיעורים מכווני נתונים. מסיבה זו, Project Lombok מספק הערות מצטברות כגון @ Data המספקות אוסף של הערות אלה. במקרה זה יכולתי לקבל התנהגות דומה מאוד למספר ההערות האישיות שסיפקתי באמצעות @Data. ההערה @Data מובילה ל- Lombok להחיל את @Getter על כל השדות ו- @Setter על כל השדות שאינם סופיים. ההבדל העיקרי הנוסף ממה שהשתמשתי בו הוא בכך שהוא משתמש ב- @ RequiredArgsConstructor ולא ב- @ AllArgsConstructor.

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

אנו רואים בפלט זה שחבורה מהשיטות הנפוצות בקוד של Boilerplate זמינות ב- Person.class המהולל. יש קונסטרוקטור עם שני פרמטרים, hashCode (), שווה (Object), toString () ושיטות ה- get and set הצפויות.

פרויקט לומבוק אינו נטול חששות ומגבלות. רבים מאלה מתבטאים בתגובות לפוסט של המלט ד'ארסי Java Without the Boilerplate - Project Lombok. מגבלה אחת היא התמיכה המופחתת ב- IDE מלבד Eclipse (אם כי יש תמיכה הגונה של NetBeans ותומכת ב- javac). דאגה היא הצורך של אחרים המשתמשים בקוד ושומרים עליו להיות בעלי תלות חדשה בלומבוק. ניתן למתן מעט דאגה זו באמצעות השימוש בדלומבוק, שניתן להשתמש בו בתהליך הבנייה במידת הצורך.

מאמרים ופרסומי בלוג אחרים המסקרים את Project Lombok כוללים את Project Lombok - לעולם אל תכתוב שוב קוד Boilerplate Java, Java Without the Boilerplate - Project Lombok, Project Lombok: Bye Bye Boilerplate, Java Posse's Project Lombok Interview, Project Lombok: Put a End to Java verbosity , פרויקט לומבוק - חובה בערכת הכלים של ג'אווה שלך, פרויקט לומבוק: קיצורי דרך שעועית מעניינים עם מעבד ההערות, ראיון: רייניר ורואל על לומבוק, צמצום קוד Boilerplate עם Project Lombok, פיתוח מהיר עם Lombok, Lombok מפחית את קוד Boilerplate שלך, וכן אלטרנטיבה טובה יותר לגטרים ולסטרים.

סיפור זה, "פונקציונליות משותפת של אובייקט Java עם Project Lombok" פורסם במקור על ידי JavaWorld.