logo

רשימה בלתי ניתנת לשינוי ב-Java

ב-Java, רשימה בלתי ניתנת לשינוי היא רשימה שלא ניתן לשנות לאחר יצירתה. ניסיון להוסיף, להסיר או לשנות אלמנטים ברשימה לאחר יצירתה יגרום לחריגה.

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

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

הצהרת כיתה

ב-Java, ה רשימה בלתי ניתנת לשינוי הכיתה היא חלק מה גויאבה הספרייה, המספקת מספר שיעורי אוסף בלתי ניתנים לשינוי. להשתמש רשימה בלתי ניתנת לשינוי , אנו מייבאים תחילה את com.google.common.collect החבילה המכילה את רשימה בלתי ניתנת לשינוי מעמד.

קריקט mylive

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

 public abstract class ImmutableList extends ImmutableCollection implements List 

רשימה בלתי ניתנת לשינוי מרחיב את ImmutableCollection מחלקה ומיישמת את רשימה מִמְשָׁק. זה מחלקה גנרית, מה שאומר שאנחנו יכולים ליצור רשימה בלתי ניתנת לשינוי מכל סוג נתונים. ה ו בהצהרה מייצג את פרמטר הסוג, אותו נוכל להחליף בכל שם מחלקה או ממשק.

היררכיה מעמדית

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

ההיררכיה המעמדית של רשימה בלתי ניתנת לשינוי הוא כדלקמן:

 java.lang.Object com.google.common.collect.ImmutableCollection com.google.common.collect.ImmutableList 

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

בסך הכל, ה רשימה בלתי ניתנת לשינוי class מספקת דרך נוחה ויעילה ליצור ולהשתמש ברשימות בלתי ניתנות לשינוי ב-Java.

יצירת ImmutableList

ישנן דרכים שונות ליצור ImmutableList ב-Java, בהתאם לגרסת ה-Java שבה אתה משתמש ולספריות הזמינות. הנה כמה דוגמאות:

1. שימוש בשיטת Java 9 of():

Java 9 הציגה שיטה חדשה בשם of() בממשק List, שיוצרת רשימות בלתי ניתנות לשינוי בצורה תמציתית וקריאה יותר. השיטה of() היא שיטת יצרן שלוקחת מספר משתנה של ארגומנטים ומחזירה רשימה בלתי ניתנת לשינוי המכילה את האלמנטים הללו. ניתן להשתמש בו עם כל מחלקה המיישמת את ממשק List, כולל ArrayList, LinkedList ו-ImmutableList. יתרון אחד בשימוש בשיטת of() הוא שהיא הרבה יותר תמציתית ומספקת בטיחות בזמן הידור על ידי ביצוע הסקת סוגים על הארגומנטים, תוך הבטחה שרק אובייקטים מהסוג הנכון יתווספו לרשימה. בסך הכל, השיטה of() מפשטת את היצירה של רשימות בלתי ניתנות לשינוי ב-Java.

השלבים למציאת הפתרון מוזכרים להלן.

  1. ייבא את המחלקה List מחבילת Java.util: מה שמאפשר לתוכנית להשתמש בממשק List כדי ליצור ולתפעל רשימות של אובייקטים.
  2. צור רשימה בלתי ניתנת לשינוי באמצעות שיטת המפעל של Java 9: ​​הקוד משתמש בשיטת List.of() כדי ליצור רשימה בלתי ניתנת לשינוי של מחרוזות עם ארבעה אלמנטים.
  3. ניסיון לשנות את הרשימה: התוכנה מנסה להוסיף אלמנט לרשימה הניתנת לשינוי באמצעות השיטה add() שאינה מותרת ברשימות בלתי ניתנות לשינוי. כתוצאה מכך, התוכנית תופסת את UnsupportedOperationException שנזרק על ידי שיטת add() ומדפיסה הודעה המציינת שלא ניתן לשנות את הרשימה.

שם קובץ: ImmutableListExample.java

 // Import the required List class from the Java.util package import java.util.List; // Define the class name public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Java 9 factory of() method List fruits = List.of('apple', 'banana', 'orange', 'grape'); // Print the elements of the List System.out.println('Fruits: ' + fruits); // Try to modify the List (will throw UnsupportedOperationException) try { fruits.add('pineapple'); } catch (UnsupportedOperationException ex) { System.out.println('Cannot modify immutable list.'); } } } 

תְפוּקָה:

 Fruits: [apple, banana, orange, grape] Cannot modify immutable List. 

2. שימוש במחלקה ImmutableList.Builder מספריית Guava:

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

ללא קשר לשיטה שבה נעשה שימוש, ניתן לגשת ל-ImmutableList המתקבל ולחזור עליה כמו כל רשימה אחרת, אך לא ניתן לשנות את התוכן שלה.

להלן הפתרון השלב לקוד הנתון:

  1. ייבא את המחלקות הנדרשות: ייבא את ממשק List ואת המחלקה ImmutableList מחבילת com.google.common.collect.
  2. צור רשימה בלתי ניתנת לשינוי באמצעות ה-Builder: צור רשימה בלתי ניתנת לשינוי באמצעות בונה ImmutableList. השתמש בשיטת add() כדי להוסיף אלמנטים לרשימה, וקרא למתודה build() כדי ליצור רשימה בלתי ניתנת לשינוי.
  3. צור רשימה בלתי ניתנת לשינוי מרשימה קיימת: צור אובייקט רשימה עם האלמנטים הרצויים. לאחר מכן קרא למתודה ImmutableList.copyOf() תוך העברת ה- List כפרמטר, כדי ליצור רשימה בלתי ניתנת לשינוי.
  4. הוספת אלמנטים נוספים: השתמש בבונה ImmutableList כדי להוסיף עוד אלמנטים באמצעות שיטת addAll() וקרא למתודה build() כדי ליצור רשימה בלתי ניתנת לשינוי.
  5. הדפס את הרשימות: השתמש בשיטת System.out.println() כדי להדפיס את התוכן של הרשימות הבלתי ניתנות לשינוי.

יישום:

שם קובץ: ImmutableListExample.java

למה ממשק סמן בג'אווה
 import java.util.List; import com.google.common.collect.ImmutableList; public class ImmutableListExample { public static void main(String[] args) { // Creating an immutable list using the builder ImmutableList immutableList1 = ImmutableListbuilder() .add('Welcome') .add('to') .add('home') .build(); // Creating an immutable list from an existing list List existingList = List.of('Welcome', 'to', 'home', 'Think'); ImmutableList immutableList2 = ImmutableList.copyOf(existingList); // Creating an immutable list from an existing list and adding more elements ImmutableList immutableList3 = ImmutableList.builder() .addAll(existingList) .add('Big') .build(); // Let's print the lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); System.out.println('Immutable List 3: ' + immutableList3); } } 

תְפוּקָה:

 Immutable List 1: [Welcome, to, home] Immutable List 2: [Welcome, to, home, Think] Immutable List 3: [Welcome, to, home, Think, Big] 

3. על ידי שימוש בשיטת of() של המחלקה ImmutableList

שיטת of() של המחלקה ImmutableList בספריית Guava מאפשרת ליצור רשימה בלתי ניתנת לשינוי עם מספר קבוע של אלמנטים. לאחר יצירת הרשימה, לא ניתן להוסיף, להסיר או לשנות את הרכיבים שלה.

שם קובץ: ImmutableListExample.java

 import com.google.common.collect.ImmutableList; import java.util.List; class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Guava library's ImmutableList class ImmutableList fruits = ImmutableList.of('apple', 'banana', 'orange', 'grape'); // Print the contents of the immutable List System.out.println('Fruits: ' + fruits); } } 

תְפוּקָה:

 Fruits: [apple, banana, orange, grape] 

4. על ידי שימוש בשיטת copyOf()

ב-Java, שיטת copyOf() יוצרת מערך חדש שמעתיק מערך קיים באורך מוגדר. השיטה לוקחת שני ארגומנטים: המערך שיועתק ואורך המערך החדש.

שם קובץ: ImmutableListExample.java

 import com.google.common.collect.ImmutableList; import java.util.*; class ImmutableListExample { public static void main(String[] args) { // Create an ArrayList and add elements to it List myArrayList = new ArrayList(); myArrayList.add('Java'); myArrayList.add('Python'); myArrayList.add('C++'); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList1 = ImmutableList.copyOf(myArrayList); // Create an array and convert it to a list String[] myArray = {'Learning', 'Web', 'Development', 'is', 'Fun'}; List myList = Arrays.asList(myArray); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList2 = ImmutableList.copyOf(myList); // Print the contents of the immutable lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); } } 

תְפוּקָה:

 Immutable List 1: [Java, Python, C++] Immutable List 2: [Learning, Web, Development, is, Fun] 

5. UnsupportedOperationException

התוכנית ממחישה יצירת רשימה בלתי ניתנת לשינוי ב-Java באמצעות שיטת Collections.unmodifiableList. בנוסף, הוא מראה כיצד לטפל ב-UnsupportedOperationException שנזרק בעת ניסיון לשנות את הרשימה.

השלבים למציאת הפתרון מוזכרים להלן:

  1. ראשית, אנו יוצרים משתנה רשימת מערך המכיל כמה אלמנטים ראשוניים באמצעות ה- שֶׁל שיטה, המחזירה רשימה בלתי ניתנת לשינוי. לאחר מכן נעביר את זה רשימת מערך אל ה Collections.unmodifiableList שיטה, המחזירה תצוגה בלתי ניתנת לשינוי של הרשימה.
  2. אנו מנסים לשנות את הרשימה הניתנת לשינוי באמצעות ה הוסף הסר , ו מַעֲרֶכֶת מכיוון שהרשימה אינה ניתנת לשינוי, ניסיון לשנות אותה יזרוק UnsupportedOperationException .
  3. אנחנו תופסים את UnsupportedOperationException שנזרק והדפיס הודעה למסוף המציינת איזו פעולה נוסתה ולא הצליחה.

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

יישום:

שם קובץ: ImmutableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using Collections.unmodifiableList List immutableList = Collections.unmodifiableList(new ArrayList(List.of('foo', 'bar', 'baz'))); // Attempt to modify the immutable List using various methods try { immutableList.add('qux'); System.out.println('Successfully added element to immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.remove(0); System.out.println('Successfully removed element from immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.set(0, 'qux'); System.out.println('Successfully modified element in immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } } } 

תְפוּקָה:

 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 

6. Collections.unmodifiableList()

Collections.unmodifiableList() היא שיטה במסגרת Java Collections Framework שיוצרת תצוגה בלתי ניתנת לשינוי של רשימה קיימת. ניתן להסיק שניסיון לשנות את הרשימה הבלתי ניתנת לשינוי יוביל להתרחשות של UnsupportedOperationException. עדיין ניתן לשנות את הרשימה המקורית, וכל שינוי יבוא לידי ביטוי ברשימה הבלתי ניתנת לשינוי.

התוכנית מציגה כיצד להשתמש בשיטת Collections.unmodifiableList() כדי ליצור ייצוג בלתי ניתן לשינוי של רשימה ניתנת לשינוי.

השלבים למציאת הפתרון מוזכרים להלן:

  1. צור רשימה הניתנת לשינוי mutableList ולהוסיף לו כמה אלמנטים באמצעות ה לְהוֹסִיף() שיטת ה רשימת מערך
  2. צור תצוגה בלתי ניתנת לשינוי של הרשימה הניתנת לשינוי mutableList משתמש ב unmodifiableList() שיטה ולהקצות אותה למשתנה רשימה בלתי ניתנת לשינוי .
  3. נסה לשנות את הרשימה הבלתי ניתנת לשינוי רשימה בלתי ניתנת לשינוי משתמש ב לְהוֹסִיף() מכיוון שהרשימה הבלתי ניתנת לשינוי היא לקריאה בלבד, זה יזרוק UnsupportedOperationException . הודעה מודפסת למסוף לאחר תופסת חריגה זו.
  4. שנה את הרשימה המקורית שניתן לשנות mutableList על ידי הוספת אלמנט נוסף באמצעות ה- לְהוֹסִיף()
  5. הדפס הן את הרשימות הניתנות לשינוי והן את הרשימות הבלתי ניתנות לשינוי למסוף כדי להראות שהרשימה הניתנת לשינוי משקפת את השינויים שבוצעו ברשימה הניתנת לשינוי המקורי.

שם קובץ: UnmodifiableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class UnmodifiableListExample { public static void main(String[] args) { List mutableList = new ArrayList(); mutableList.add('apple'); mutableList.add('banana'); mutableList.add('orange'); // Create an unmodifiable view of the mutableList List unmodifiableList = Collections.unmodifiableList(mutableList); // Attempt to modify the unmodifiableList will throw UnsupportedOperationException try { unmodifiableList.add('pear'); } catch (UnsupportedOperationException e) { System.out.println('Attempt to modify unmodifiableList failed: ' + e.getMessage()); } // The original mutableList can still be modified mutableList.add('pear'); // The unmodifiableList will reflect the changes made to the original mutableList System.out.println('mutableList: ' + mutableList); // [apple, banana, orange, pear] System.out.println('unmodifiableList: ' + unmodifiableList); // [apple, banana, orange, pear] } } 

תְפוּקָה:

 Attempt to modify unmodifiableList failed: null mutableList: [apple, banana, orange, pear] unmodifiableList: [apple, banana, orange, pear] 

היתרונות של ImmutableList

ל-ImmutableList מספר יתרונות, כולל:

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