Java lista inicializálása egy sorban

1. Bemutatkozás

Ebben a gyors bemutatóban megvizsgáljuk, hogyan inicializálhatjuk a Lista egysoros használatával.

2. Hozzon létre egy tömbből

Hozhatunk létre a Lista egy tömbből és a tömb literáloknak köszönhetően egy sorban inicializálhatjuk őket:

List list = Arrays.asList (új karakterlánc [] {"foo", "bar"});

Bízhatunk abban, hogy a varargs mechanizmus kezeli a tömb létrehozását. Ezzel rövidebb és olvashatóbb kódot írhatunk:

@Test public void givenArraysAsList_thenInitialiseList () {List list = Arrays.asList ("foo", "bar"); assertTrue (list.contains ("foo")); }

Ennek a kódnak az eredménypéldánya valósítja meg a Lista felület, de ez nem a java.util.ArrayList sem a LinkedList. Ehelyett a Lista az eredeti tömb alátámasztja, amelynek két vonzata van.

Bár az osztály neve történetesen az Tömb lista hanem a java.util.A Arrays csomag.

2.1. Rögzített méret

Az eredménypéldány innen: Tömbök.asList fix méretű lesz:

@Test (várható = Nem támogatottOperationException.class) public void givenArraysAsList_whenAdd_thenUnsupportedException () {List list = Arrays.asList ("foo", "bar"); list.add ("baz"); }

2.2. Megosztott referencia

Az eredeti tömbnek és a listának ugyanazok a hivatkozások vannak az objektumokra:

@Test public void givenArraysAsList_whenCreated_thenShareReference () {String [] tömb = {"foo", "bar"}; Lista lista = tömbök.asList (tömb); tömb [0] = "baz"; assertEquals ("baz", list.get (0)); }

3. Létrehozás adatfolyamból (Java 8)

Könnyen átalakíthatjuk a Folyam bármiféle Gyűjtemény.

Ezért a gyári módszerekkel Patakok, egy sorban létrehozhatunk és inicializálhatunk listákat:

@Test public void givenStream_thenInitializeList () {List list = Stream.of ("foo", "bar") .collect (Collectors.toList ()); assertTrue (list.contains ("foo")); }

Itt meg kellene jelölnünk azt Collectors.toList () nem garantálja a visszaküldött pontos végrehajtását Lista.

Nincs általános szerződés a visszaküldött példány módosíthatóságáról, sorozhatóságáról vagy szálbiztonságáról. Ezért kódunk nem támaszkodhat ezekre a tulajdonságokra.

Egyes források ezt kiemelik Stream.of (…) .collect (…) nagyobb memória és teljesítménynyom lehet, mint Arrays.asList () de szinte minden esetben olyan mikrooptimalizálásról van szó, hogy alig van különbség.

4. Gyári módszerek (Java 9)

A JDK 9-ben számos kényelmes gyári módszert vezettek be a gyűjtemények számára:

Lista lista = List.of ("foo", "bar", "baz"); Set set = Set.of ("foo", "bar", "baz");

Az egyik fontos részlet a visszaküldött példányok változhatatlanok. Ezen túlmenően a gyári módszereknek számos előnye van a helytakarékosság és a menetbiztonság terén.

Ezt a témát ebben a cikkben tárgyaljuk tovább.

5. Kettős merevítő inicializálása

Több helyen találhatunk úgynevezett módszert „Kettős zárójeles inicializálás” ami úgy néz ki:

@Test public void givenAnonymousInnerClass_thenInitialiseList () {Városok listája = new ArrayList () {{add ("New York"); add ("Rio"); add ("Tokió"); }}; assertTrue (városok tartalmazzák ("New York")); }

A név „Kettős zárójeles inicializálás” meglehetősen félrevezető. A szintaxis kompaktnak és elegánsnak tűnhet, de veszélyesen elrejti a motorháztető alatt rejlő dolgokat.

Valójában nincs egy „Kettős zárójel” szintaxis elem a Java-ban, ez két blokk szándékosan formázva így.

A külső merevítőkkel egy névtelen belső osztályt nyilvánítunk, amely a Tömb lista. Ezekben a zárójelekben deklarálhatjuk alosztályunk részleteit.

Szokás szerint használhatunk példányinicializáló blokkokat, és innen származnak a belső fogszabályozó párok.

Ennek a szintaxisnak a rövidsége csábító, azonban anti-mintának tekinthető.

Ha többet szeretne megtudni a kettős zárójeles inicializálásról, tekintse meg cikkünket itt.

6. Következtetés

A Modern Java számos lehetőséget kínál a Gyűjtemény egy sorban. Az általunk választott módszer szinte teljes egészében a személyes preferenciáktól függ, nem pedig a technikai érveléstől.

Fontos elvitel, hogy bár kecsesnek tűnik, a névtelen belső osztály inicializálásának anti-mintája (más néven „kettős zárójel”) számos negatív mellékhatással jár.

Mint mindig, a kód elérhető a GitHubon.


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