2009-07-20 27 views
463

Załóżmy, że mam metodę m(), która pobiera tablicę łańcuchów jako argument. Czy istnieje sposób, w jaki mogę po prostu zadeklarować tę tablicę w linii, kiedy wykonam połączenie? tj Zamiast:Czy można zadeklarować tablicę w linii?

String[] strs = {"blah", "hey", "yo"}; 
m(strs); 

mogę po prostu zastąpić ten z jednej linii, i uniknąć deklarowania nazwie zmiennej, która nigdy nie będę w użyciu?

+2

IDE, który obsługuje ponowne faktoring pozwoli na in- linia strs automatycznie. –

Odpowiedz

734
m(new String[]{"blah", "hey", "yo"}); 
+43

Tylko na przyszłość, ten typ tablicy jest znany jako anonimowa tablica (ponieważ nie ma ona nazwy). przeszukiwanie "Anonimowa tablica java" dałoby pewne wyniki. – Falaina

+1

Przypomina odlewanie. Myślę, że tak to wymyślę, więc nie muszę google raz w bluemoonie muszę to zrobić. – ArtOfWarfare

91

Draemon jest poprawny. Można również zadeklarować m jak przy varargs:

void m(String... strs) { 
    // strs is seen as a normal String[] inside the method 
} 

m("blah", "hey", "yo"); // no [] or {} needed; each string is a separate arg here 
+12

całkiem dobra składnia, ale dzięki tej metodzie można mieć tylko jeden parametr tablicy i musi on być ostatnim. Tak więc nie możesz zrobić: 'void m (String ... strs, Integer ... intgrs)' na przykład. – bluefoot

+5

blefoot ma rację. Ale możesz zrobić "void m (Integer i, Double d, String ... str)' –

+0

@MichaelMyers Jakie jest znaczenie '(String ... strs)' –

2

Chciałbym dodać, że składnia inicjalizacji tablicy jest bardzo zwięzła i elastyczna. Używam go dużo, aby wyodrębnić dane z mojego kodu i umieścić go gdzieś bardziej użyteczny.

Jako przykład, mam często tworzone menu takie jak ten:

Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...}); 

Pozwoliłoby mi się napisać kod, aby skonfigurować system menu. "+" Wystarczy, by powiedzieć, żeby umieścić ten przedmiot pod poprzednim przedmiotem.

Mogę powiązać go z klasą menuHandler konwencją nazewnictwa metod, nazywając moje metody czymś w stylu "menuFile, menuFileSave, menuFileLoad, ..." i wiążąc je refleksyjnie (są inne alternatywy).

Ta składnia pozwala na AMAZINGLY krótką definicję menu i wyjątkowo przydatną metodę "initMenus". (Nie zawracam sobie głowy jego ponownym użyciem, ponieważ pisanie jest zawsze zabawne i zajmuje tylko kilka minut + kilka linii kodu).

za każdym razem, gdy zobaczysz wzór w kodzie, sprawdź, czy możesz go zastąpić czymś takim i zawsze pamiętaj, jak zwięzła jest składnia inicjalizacji macierzy !.

+4

Byłoby to również lepiej zrobić jako varargs. Poza tym każdy, kto lubi pisać kod na "zabawę" zasługuje na głos! Kodowanie polega na rozwiązywaniu nowych problemów, a nie na pisaniu. Och, czekaj, to jest Java ;-) – mjaggard

+1

Masz rację, kiedy to napisałem, nie użyłem zbyt wiele varargs - i użyłem inicjalizacji tablic całkiem sporo, zanim istniały już warargi w Javie. Jedną częścią, dla której wciąż wolałbym tablice, jest to, że jeśli zdefiniujesz to jako aray, możesz ustawić stałą na górze pliku zamiast danych wbudowanych, i możesz również wyodrębnić go do pliku konfiguracyjnego –

+0

Przy okazji 8 lat później musiałbym powiedzieć, że teraz używam adnotacji, aby zrobić prawie wszystkie rzeczy, z których korzystałem do inicjowania macierzy ciągów. –

1

Jak mówi Draemon, najbliższa że Java przychodzi do inline tablic jest new String[]{"blah", "hey", "yo"} jednak jest czysty trik, który pozwala zrobić coś jak

array("blah", "hey", "yo") z typem automatycznie wywnioskować.

Pracuję nad przydatnym API do rozszerzania języka Java, aby umożliwić wstawianie tablic i typów kolekcji. Dla bardziej szczegóły projektu google Espresso4J czy to sprawdzić here

+7

Kilka problemów tutaj: 1. Upewnij się, że w twoich wpisach i profilu jasno wyjaśniasz, że jesteś powiązany z Espresso4J (zapoznaj się z [FAQ # promotion]) 2. Uważaj na linki do swojej strony internetowej na dość starych postach (w szczególności odpowiedzi na takie pytania jak ten i [ten] (http://stackoverflow.com/questions/1473868/why-cant-i-create-a-new-java-array-inline/7300580#7300580)) - wychodzi jako bardzo spamerski i podnosi flagi, które utrudnią twój przedstawiciel. – Kev

+0

@Kev ah sorry. Wyjaśniłem, że jestem deweloperem dobrego projektu Espresso4J teraz :) –

20

Innym sposobem, aby to zrobić, jeśli chcesz wynik jako inline listy, można zrobić to tak:

Arrays.asList(new String[] { "String1", "string2" }); 
+27

faktycznie nie musisz tworzyć tablicy, możesz po prostu zrobić: 'Arrays.asList (" string1 "," string2 ", .. .) ' – elias

+1

Tak! = D A żeby pamiętać, tablica stworzona w ten sposób jest niezmienna. –

+2

Prawdopodobnie przydatny punkt: Nie można tego zrobić z prymitywami. W efekcie otrzymasz jednoelementowe 'List' typu' type [] ', gdzie' type' jest tym prymitywem. na przykład 'Arrays.asList ([some ints])' daje w wyniku 'List '. – Moira

3

Można utworzyć metodę gdzieś

public static <T> T[] toArray(T... ts) { 
    return ts; 
} 

następnie używać go

m(toArray("blah", "hey", "yo")); 

dla lepszego wyglądu.

1

Teraz można bezpośrednio napisać tablicę we współczesnej Javie bez inicjalizatora. Twój przykład jest już prawidłowy.

String[] array = {"blah", "hey", "yo"}; 

lub

int[] array = {1, 2, 3}; 
0

Inną opcją jest użycie ArrayUtils.toArray w org.apache.commons.lang3

ArrayUtils.toArray("elem1","elem2") 
Powiązane problemy