מבוא לבלתי משתנה

1. הקדמה

במאמר זה נראה כיצד לעבוד עם ספריית Immutables.

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

2. תלות Maven

על מנת להשתמש ב- Immutables בפרויקט שלך, עליך להוסיף את התלות הבאה ל- תלות החלק שלך pom.xml קוֹבֶץ:

 ערך org.immutables 2.2.10 מסופק 

מכיוון שחפץ זה אינו נדרש בזמן ריצה, מומלץ לציין את ה- בתנאי תְחוּם.

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

3. בלתי משתנים

הספרייה מייצרת אובייקטים בלתי ניתנים לשינוי מסוגים מופשטים: מִמְשָׁק, מעמד, ביאור.

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

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

והערה מהירה - מכיוון ש- Immutables משתמש בעיבוד הערות, עליכם לזכור לאפשר עיבוד הערות ב- IDE שלכם.

3.1. באמצעות ערך. אי אפשר לעמוד עם שיעורים מופשטים ו ממשקים

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

@ Value.Immutable ציבור מופשט בכיתה אדם {מופשט מחרוזת getName (); מופשט שלם getAge (); }

לאחר סיום עיבוד ההערות נוכל למצוא מכשיר מוכן לשימוש, שנוצר לאחרונה אישיות ניתנת לשינוי כיתה בא מטרה / מקורות שנוצרו מַדרִיך:

@Generated ({"Immutables.generator", "Person"}) מחזור סופי ציבורי ImmutablePerson מרחיב את האדם {private final שם מחרוזת; גיל סופי פרטי שלם; פרטי ImmutablePerson (שם מחרוזת, גיל שלם) {this.name = שם; this.age = גיל; } @Override String getName () {שם החזרה; } @Override Integer getAge () {גיל החזרה; } // toString, hashcode, שווה, copyOf ובונה הושמט}

המעמד שנוצר מגיע עם מיושם toString, hashcode, שווים שיטות ועם בונה חורג ImmutablePerson.Builder. שימו לב שיש לבנאי שנוצר פְּרָטִי גִישָׁה.

על מנת לבנות מופע של אישיות ניתנת לשינוי בכיתה, עלינו להשתמש בבונה או בשיטה הסטטית ImmutablePerson.copyOf, אשר יכול ליצור אישיות ניתנת לשינוי העתק מתוך אדם לְהִתְנַגֵד.

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

ImmutablePerson john = ImmutablePerson.builder () .age (42) .name ("John") .build ();

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

בואו נעדכן ג'ון גיל וליצור חדש john43 לְהִתְנַגֵד:

ImmutablePerson john43 = john.withAge (43); 

במקרה כזה הטענות הבאות יהיו נכונות:

assertThat (john) .isNotSameAs (john43);
assertThat (john.getAge ()). isEqualTo (42);

4. כלי עזר נוספים

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

4.1. ה @ Value.Parameter ביאור

ה @ Value.Parameter ניתן להשתמש בהערה לציון שדות, עבורם יש ליצור שיטת קונסטרוקטור.

אם אתה מציין את הכיתה שלך כך:

@ Value.Umableable abstract abstract class אדם {@ Value.Parameter תקציר מחרוזת getName (); @ Value.Parameter תקציר שלם getAge (); }

ניתן יהיה ליצור את זה בדרך הבאה:

ImmutablePerson.of ("ג'ון", 42);

4.2. ה @ Value.Default ביאור

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

@ Value.Immutable ציבור מופע בכיתה אדם {מופשט מחרוזת getName (); @ Value.Default שלם getAge () {חזרה 42; }}

הקביעה הבאה תהיה נכונה:

ImmutablePerson john = ImmutablePerson.builder () .name ("ג'ון") .build (); assertThat (john.getAge ()). isEqualTo (42);

4.3. ה ערך. עזר ביאור

ה ערך. עזר ניתן להשתמש בהערה להערת מאפיין שיישמר במופע של אובייקט, אך יתעלם ממנו שווים, hashCode ו toString יישומים.

אם אתה מציין את הכיתה שלך כך:

@ Value.Immutable ציבור מופשט בכיתה אדם {מופשט מחרוזת getName (); מופשט שלם getAge (); @ Value.Auxiliary מופשט מחרוזת getAuxiliaryField (); }

הקבוצות הבאות יהיו נכונות בעת השימוש ב- עזר שדה:

ImmutablePerson john1 = ImmutablePerson.builder () .name ("John") .age (42) .auxiliaryField ("Value1") .build (); ImmutablePerson john2 = ImmutablePerson.builder () .name ("John") .age (42) .auxiliaryField ("Value2") .build (); 
assertThat (john1.equals (john2)). isTrue ();
assertThat (john1.toString ()). isEqualTo (john2.toString ()); 
assertThat (john1.hashCode ()). isEqualTo (john2.hashCode ());

4.4. ה @ Value.Immutable (Prehash = True) ביאור

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

אם אתה מציין את הכיתה שלך כך:

@ Value.Immutable (prehash = true) מעמד מופשט ציבורי אדם {מופשט מחרוזת getName (); מופשט שלם getAge (); }

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

@Generated ({"Immutables.generator", "Person"}) מחזור סופי ציבורי ImmutablePerson מרחיב את האדם {private final שם מחרוזת; גמר פרטי שלם שלם; פרטית int hashCode; פרטי ImmutablePerson (שם מחרוזת, גיל שלם) {this.name = שם; this.age = גיל; this.hashCode = computeHashCode (); } // שיטות שנוצרו @Override public int hashCode () {return hashCode; }} 

ה hashCode () השיטה מחזירה מחשב מראש hashcode נוצר בעת בניית האובייקט.

5. מסקנה

במדריך מהיר זה הראינו את פעולות היסוד של ספריית Immutables.

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


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