Tahan luua nimekirja valikuvõimalustest testimise eesmärgil. Alguses tegin seda:
ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");
Siis muutsin koodi järgmiselt:
ArrayList<String> places = new ArrayList<String>(
Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
Kas on olemas parem viis seda teha?
Oleks lihtsam, kui te lihtsalt deklareeriksite selle kui List
- kas see peab olema ArrayList?
List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
Või kui sul on ainult üks element:
List<String> places = Collections.singletonList("Buenos Aires");
See tähendaks, et kohad
on mittekaitstav (püüdes seda muuta, tekitatakse erand UnsupportedOperationException
).
Et muuta muutuv loetelu, mis on konkreetne ArrayList
, saab muutumatust loetelust luua ArrayList
:
ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
Tegelikult on ilmselt "parim" viis ArrayList
i initsialiseerimiseks see meetod, mille sa kirjutasid, kuna see ei pea kuidagi uut List
i looma:
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
Konks on selles, et sellele Listi
eksemplarile viitamiseks on vaja üsna palju sisestamist.
On alternatiive, näiteks anonüümse sisemise klassi tegemine koos instantsi initsiaatoriga (tuntud ka kui "double brace initialization"):
ArrayList<String> list = new ArrayList<String>() {{
add("A");
add("B");
add("C");
}};
Kuid mulle ei meeldi see meetod väga, sest see, mis sa lõpuks saad, on ArrayList
alamklass, millel on instantsi initsiaator ja see klass luuakse ainult ühe objekti loomiseks -- see tundub mulle lihtsalt natuke liigne.
Tore oleks olnud, kui Collection Literals ettepanek Project Coin oleks vastu võetud (see oli kavas kasutusele võtta Java 7-s, aga tõenäoliselt ei'sse ka Java 8-sse.):
List<String> list = ["A", "B", "C"];
Kahjuks ei'aita see siin, kuna see initsialiseerib muutumatu List
i, mitte ArrayList
, ja pealegi ei ole see'veel saadaval, kui üldse kunagi saab.
Sa võid luua tehase meetodi:
public static ArrayList<String> createArrayList(String ... elements) {
ArrayList<String> list = new ArrayList<String>();
for (String element : elements) {
list.add(element);
}
return list;
}
....
ArrayList<String> places = createArrayList(
"São Paulo", "Rio de Janeiro", "Brasília");
Aga see'ei ole palju parem kui sinu esimene refaktooring.
Suurema paindlikkuse saavutamiseks võib see olla üldine:
public static <T> ArrayList<T> createArrayList(T ... elements) {
ArrayList<T> list = new ArrayList<T>();
for (T element : elements) {
list.add(element);
}
return list;
}