28. ledna 2010

Inicializace a plnění kolekce na jediném řádku

Při psaní testů (zejména při vytváření testovacích dat) rád používám "zkrácené" zápisy pro inicializaci a plnění kolekcí.

Každého asi napadne použití Arrays.asList metody:


List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");

To je krátké, elegantní, ale s jednou malinkou nevýhodou. Takto se dá vytvořit pouze seznam, ne např. množina (i když samozřejmě není problém vložit kolekci do kolekce a tedy vytvořit množinu ze seznamu).

Já kromě výše uvedeného ještě používám tento zápis (většinou, když potřebuji jednopoložkovou kolekci a není to seznam):

new ArrayList<String>() {{add("Larry");}}

Na první pohled možná trochu magické, ale když se to rozepíše do více řádků, tak je zřejmé, že se využívá inicializačního bloku. Navíc tento zápis se neomezuje jen na kolekce, ale na jakýkoliv objekt.

3 komentáře:

Jiří Pejchal řekl(a)...

Nebo pomocí google collections:

List stooges = Lists.newArrayList("Larry", "Moe", "Curly");

Vít Šesták 'v6ak' řekl(a)...

Nevýhod to má víc:
* je vytvořena další třída
* tato třída má (cca) reference na obklopující třídu a na všechny její finální proměnné => možný memory leak!

Jiří Pejchal řekl(a)...

Pomocí google collections to jde i pro množiny:

Set set = Sets.newHashSet("prvni", "druhy", "treti");

Případně pro immutable množinu:
Set set = ImmutableSet.of("prvni", "druhy", "treti");