יישומי מפות בלתי ניתנים לשינוי בג'אווה

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

לעיתים עדיף לא לאפשר שינויים ב- java.util.Map כגון שיתוף נתונים לקריאה בלבד על פני שרשורים. לשם כך אנו יכולים להשתמש במפה שאינה ניתנת לשינוי או במפה בלתי ניתנת לשינוי.

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

2. בלתי ניתן לשינוי לעומת בלתי ניתן לשינוי

מפה שאינה ניתנת לשינוי היא רק עטיפה מעל מפה ניתנת לשינוי והיא אינה מאפשרת לשנות אותה ישירות:

מפה mutableMap = HashMap חדש (); mutableMap.put ("ארה"ב", "צפון אמריקה"); Map unmodifiableMap = Collections.unmodifiableMap (mutableMap); assertThrows (UnsupportedOperationException.class, () -> unmodifiableMap.put ("קנדה", "צפון אמריקה"));

אך עדיין ניתן לשנות את המפה המשתנה הבסיסית והשינויים משתקפים גם במפה שאינה ניתנת לשינוי:

mutableMap.remove ("ארה"ב"); assertFalse (unmodifiableMap.containsKey ("ארה"ב")); mutableMap.put ("מקסיקו", "צפון אמריקה"); assertTrue (unmodifiableMap.containsKey ("מקסיקו"));

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

3. המפה הבלתי ניתנת לשינוי של גויאבה

גויאבה מספקת גרסאות בלתי ניתנות לשינוי של כל אחת מהן java.util.מַפָּהבאמצעות ImmutableMap. זה זורק לא נתמךOperationException בכל פעם שאנחנו מנסים לשנות את זה.

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

נדון כעת בדרכים שונות ליצירת מקרים של ImmutableMap.

3.1. באמצעות העתק של() שיטה

ראשית, בואו נשתמש ב- ImmutableMap.copyOf () שיטה המחזירה עותק של כל הערכים כמו במפה המקורית:

ImmutableMap immutableMap = ImmutableMap.copyOf (mutableMap); assertTrue (immutableMap.containsKey ("ארה"ב"));

לא ניתן לשנות אותו ישירות או בעקיפין:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("קנדה", "צפון אמריקה")); mutableMap.remove ("ארה"ב"); assertTrue (immutableMap.containsKey ("ארה"ב")); mutableMap.put ("מקסיקו", "צפון אמריקה"); assertFalse (immapableMap.containsKey ("מקסיקו"));

3.2. באמצעות בּוֹנֶה() שיטה

אנחנו יכולים גם להשתמש ImmutableMap.builder () שיטה ליצירת עותק של כל הערכים כמו במפה המקורית.

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

ImmutableMap immutableMap = ImmutableMap.builder () .putAll (mutableMap) .put ("קוסטה ריקה", "צפון אמריקה") .build (); assertTrue (immutableMap.containsKey ("ארה"ב")); assertTrue (immapableMap.containsKey ("קוסטה ריקה"));

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

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("קנדה", "צפון אמריקה")); mutableMap.remove ("ארה"ב"); assertTrue (immutableMap.containsKey ("ארה"ב")); mutableMap.put ("מקסיקו", "צפון אמריקה"); assertFalse (immapableMap.containsKey ("מקסיקו"));

3.3. באמצעות שֶׁל() שיטה

לבסוף, אנו יכולים להשתמש ImmutableMap.of () שיטה ליצירת מפה בלתי ניתנת לשינוי עם סט ערכים המסופקים בזמן. הוא תומך לכל היותר בחמישה זוגות מפתח / ערך:

ImmutableMap immutableMap = ImmutableMap.of ("ארה"ב", "צפון אמריקה", "קוסטה ריקה", "צפון אמריקה"); assertTrue (immutableMap.containsKey ("ארה"ב")); assertTrue (immapableMap.containsKey ("קוסטה ריקה"));

איננו יכולים לשנות זאת גם:

assertThrows (UnsupportedOperationException.class, () -> immutableMap.put ("קנדה", "צפון אמריקה"));

4. מסקנה

במאמר מהיר זה דנו בהבדלים בין מפה בלתי ניתנת לשינוי לבין מפה בלתי ניתנת לשינוי.

בדקנו גם דרכים שונות ליצור גויאבה ImmutableMap.

וכמו תמיד, דוגמאות הקוד המלאות זמינות ב- GitHub.