Inicijalizacija Java popisa u jednom retku

1. Uvod

U ovom brzom vodiču istražit ćemo kako možemo inicijalizirati a Popis koristeći jednoslojne obloge.

2. Stvori iz niza

Možemo stvoriti Popis iz niza i zahvaljujući literalima niza možemo ih inicijalizirati u jednom retku:

Lista popisa = Arrays.asList (novi String [] {"foo", "bar"});

Možemo vjerovati da mehanizam varargs obrađuje stvaranje niza. Po tome možemo napisati sažetiji i čitljiviji kod:

@Test javna praznina givenArraysAsList_thenInitialiseList () {Popis popisa = Arrays.asList ("foo", "bar"); assertTrue (list.contens ("foo")); }

Rezultat ovog koda implementira Popis sučelje, ali nije java.util.ArrayList niti a LinkedList. Umjesto toga, to je Popis potkrijepljen izvornim nizom koji ima dvije implikacije.

Iako se ime klase događa ArrayList ali u java.util.Arrays paket.

2.1. Fiksna veličina

Primjer rezultata iz Nizovi.asList imat će fiksnu veličinu:

@Test (očekuje se = UnsupportedOperationException.class) javna praznina givenArraysAsList_whenAdd_thenUnsupportedException () {Lista popisa = Arrays.asList ("foo", "bar"); list.add ("baz"); }

2.2. Zajednička referenca

Izvorni niz i popis dijele iste reference na objekte:

@Test javna praznina givenArraysAsList_whenCreated_thenShareReference () {String [] array = {"foo", "bar"}; Lista popisa = Arrays.asList (niz); niz [0] = "baz"; assertEquals ("baz", list.get (0)); }

3. Stvori iz streama (Java 8)

Jednostavno možemo pretvoriti a Stream u bilo koju vrstu Kolekcija.

Stoga s tvorničkim metodama za Potoci, možemo stvoriti i inicijalizirati popise u jednom retku:

@Test javna praznina givenStream_thenInitializeList () {Lista popisa = Stream.of ("foo", "bar") .collect (Collectors.toList ()); assertTrue (list.contens ("foo")); }

Ovdje bismo trebali označiti to Collectors.toList () ne jamči točnu provedbu vraćenog Popis.

Ne postoji opći ugovor o promjenjivosti, serializaciji ili sigurnosti niti vraćene instance. Stoga se naš kod ne bi trebao oslanjati ni na jedno od ovih svojstava.

Neki izvori to ističu Stream.of (…) .collect (…) može imati veću memoriju i otisak performansi od Arrays.asList () ali u gotovo svim slučajevima to je takva mikro-optimizacija da postoji mala razlika.

4. Tvorničke metode (Java 9)

U JDK 9 uvedeno je nekoliko prikladnih tvorničkih metoda za kolekcije:

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

Jedan važan detalj je da su vraćene instance nepromjenjive. Osim toga, tvorničke metode imaju nekoliko prednosti u svemirskoj učinkovitosti i sigurnosti navoja.

Ova je tema istražena više u ovom članku.

5. Double-Brace inicijalizacija

Na nekoliko mjesta možemo pronaći metodu tzv "Inicijalizacija dvostruke zagrade" što izgleda ovako:

@Test javna praznina givenAnonymousInnerClass_thenInitialiseList () {Popis gradova = novi ArrayList () {{add ("New York"); dodaj ("Rio"); dodaj ("Tokio"); }}; assertTrue (cities.contens ("New York")); }

Ime "Inicijalizacija dvostruke zagrade" prilično zavarava. Sintaksa može izgledati kompaktno i elegantno, ali opasno skriva ono što se događa ispod haube.

Zapravo ne postoji "Dvostruka zagrada" element sintakse u Javi, to su dva bloka formatirana namjerno na ovaj način.

Vanjskim zagradama proglašavamo anonimnu unutarnju klasu koja će biti podrazred ArrayList. Unutar ovih zagrada možemo izjaviti detalje našeg podrazreda.

Kao i obično, možemo koristiti blokove inicijalizatora instance i odatle dolazi unutarnji par zagrada.

Kratkoća ove sintakse primamljiva je, no smatra se anti-uzorkom.

Da biste pročitali više o inicijalizaciji dvostrukim zagradama, pogledajte naš članak ovdje.

6. Zaključak

Moderna Java nudi nekoliko mogućnosti za stvaranje a Kolekcija u jednom retku. Metoda koju smo odabrali gotovo se u potpunosti temelji na osobnim preferencijama, a ne na tehničkom obrazloženju.

Važno za poneti jest da, iako izgleda graciozno, anti-obrazac anonimne inicijalizacije unutarnje klase (tzv. "dvostruka zagrada") ima mnogo negativnih nuspojava.

Kao i uvijek, kôd je dostupan na GitHub-u.