אתחול רשימת Java בשורה אחת

1. הקדמה

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

2. צור מתוך מערך

אנחנו יכולים ליצור רשימה ממערך ובזכות מילולי מערך אנו יכולים לאתחל אותם בשורה אחת:

רשימת רשימה = Arrays.asList (מחרוזת חדשה [] {"foo", "bar"});

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

@Test ציבור בטל givenArraysAsList_thenInitialiseList () {List list = Arrays.asList ("foo", "bar"); assertTrue (list.contains ("foo")); }

מופע התוצאה של קוד זה מיישם את רשימה ממשק אבל זה לא java.util.ArrayList וגם לא רשימה מקושרת. במקום זאת, זה רשימה מגובה במערך המקורי שיש לו שתי השלכות.

אמנם, שם הכיתה קורה רשימת מערך אבל ב java.util. מערכים חֲבִילָה.

2.1. מידה קבועה

מופע התוצאה מ Arrays.asList יהיה בגודל קבוע:

@Test (צפוי = UnsupportedOperationException.class) חלל ציבורי givenArraysAsList_whenAdd_thenUnsupportedException () {List list = Arrays.asList ("foo", "bar"); list.add ("בז"); }

2.2. הפניה משותפת

המערך המקורי והרשימה חולקים את אותם הפניות לאובייקטים:

@Test ציבורי בטל givenArraysAsList_whenCreated_thenShareReference () {String [] array = {"foo", "bar"}; רשימת רשימה = Arrays.asList (מערך); מערך [0] = "baz"; assertEquals ("baz", list.get (0)); }

3. צור מזרם (Java 8)

אנחנו יכולים להמיר בקלות א זרם לכל סוג של אוסף.

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

@ מבחן חלל ציבורי givenStream_thenInitializeList () {List list = Stream.of ("foo", "bar") .collect (Collectors.toList ()); assertTrue (list.contains ("foo")); }

עלינו לסמן כאן את זה Collectors.toList () אינו מתחייב ליישום המדויק של ההחזר רשימה.

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

מקורות מסוימים מדגישים זאת Stream.of (...) .collect (...) עשוי להיות בעל זיכרון וביצועים גדולים יותר מ Arrays.asList () אבל כמעט בכל המקרים, מדובר במיקרו-אופטימיזציה כזו שיש הבדל קטן.

4. שיטות מפעל (Java 9)

ב- JDK 9 הוצגו מספר שיטות מפעל נוחות לאוספים:

רשימת רשימה = List.of ("foo", "bar", "baz"); Set set = Set.of ("foo", "bar", "baz");

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

נושא זה נחקר יותר במאמר זה.

5. אתחול פלטה כפולה

במספר מקומות אנו יכולים למצוא שיטה הנקראת 'אתחול סוגר כפול' שנראה כמו:

@Test הציבור בטל givenAnonymousInnerClass_thenInitialiseList () {רשימה ערים = ArrayList חדש () {{add ("ניו יורק"); הוסף ("ריו"); הוסף ("טוקיו"); }}; assertTrue (ערים. מכיל ("ניו יורק")); }

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

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

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

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

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

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

6. מסקנה

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

טייק אווי חשוב הוא שלמרות שהוא נראה חינני, לתבנית האנטי-דפוסי של אתחול מעמדי פנימי אנונימי (aka 'סד כפול') יש תופעות לוואי שליליות רבות.

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


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