Co oznaczają 3 kropki w poniższej metodzie?
public void myMethod(String... strings){
// method body
}
źródło
Co oznaczają 3 kropki w poniższej metodzie?
public void myMethod(String... strings){
// method body
}
Oznacza to, że zero lub więcej obiektów String (lub ich tablica) może zostać przekazanych jako argument (y) dla tej metody.
Zobacz sekcję „Arbitrary Number of Arguments” tutaj: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs
W twoim przykładzie możesz nazwać to dowolną z następujących czynności:
myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});
Ważna uwaga: Argumenty przekazywane w ten sposób są zawsze tablicami - nawet jeśli istnieje tylko jeden. Upewnij się, że traktujesz to w ten sposób w treści metody.
Ważna uwaga 2: Argument, który pobiera wartość ...
musi być ostatnim w sygnaturze metody. Więc myMethod(int i, String... strings)
jest w porządku, ale myMethod(String... strings, int i)
nie jest w porządku.
Dzięki Vashowi za wyjaśnienia w jego komentarzu.
someMethod(new SomeType[] { })
. To byłby hack, prawda?Ta funkcja nazywa się varargs i jest to funkcja wprowadzona w Javie 5. Oznacza to, że funkcja może odbierać wiele
String
argumentów:Następnie możesz użyć
String
var jako tablicy:Ta odpowiedź mocno zapożycza od Kiswy i Lorenza ... a także od komentarza Graphaina.
źródło
To Varargs :)
Skróty varargs dla argumentów o zmiennej długości to funkcja, która pozwala metodzie zaakceptować zmienną liczbę argumentów (zero lub więcej). Dzięki varargs stało się proste tworzenie metod, które muszą przyjmować zmienną liczbę argumentów. Funkcja zmiennej argument została dodana w Javie 5.
Składnia varargs
Vararg jest oddzielony trzema elipsami (trzy kropki) po typie danych, jego ogólna postać to
Potrzeba varargs
W wersjach wcześniejszych niż Java 5, w przypadku gdy potrzebna była zmienna liczba argumentów, istniały dwa sposoby jej obsługi
Jeśli maksymalna liczba argumentów, jaką może przyjąć metoda, była niewielka i znana, można by stworzyć przeciążone wersje metody. Jeśli maksymalna liczba argumentów, które może przyjąć metoda, była duża lub nieznana, wówczas podejście polegało na umieszczeniu tych argumentów w tablicy i przekazaniu ich do metody, która przyjmuje tablicę jako parametr. Te dwa podejścia były podatne na błędy - konstruowanie tablicy parametrów za każdym razem i trudne do utrzymania - ponieważ dodanie nowego argumentu może spowodować napisanie nowej, przeciążonej metody.
Zalety varargs
Oferuje znacznie prostszą opcję. Mniej kodu, ponieważ nie trzeba pisać przeciążonych metod.
Przykład varargs
Z programu widać, że długość jest tutaj używana do znalezienia liczby argumentów przekazanych do metody. Jest to możliwe, ponieważ varargs są domyślnie przekazywane jako tablica. Wszelkie argumenty przekazywane jako varargs są przechowywane w tablicy, do której odwołuje się nazwa nadana varargs. W tym programie nazwa tablicy to wartości. Zauważ też, że metoda jest wywoływana z inną liczbą argumentów, najpierw wywołanie z czterema argumentami, następnie trzema argumentami, a następnie z zerowymi argumentami. Wszystkie te wywołania są obsługiwane tą samą metodą, która przyjmuje varargs.
Ograniczenia dotyczące varargs
Możliwe jest posiadanie innych parametrów z parametrem varargs w metodzie, jednak w takim przypadku parametr varargs musi być ostatnim parametrem zadeklarowanym przez metodę.
Innym ograniczeniem dotyczącym varargs jest to, że musi istnieć tylko jeden parametr varargs.
Przeciążanie metod varargs
Możliwe jest przeciążenie metody przyjmującej parametr varargs. Metoda Varargs może być przeciążona przez -
Rodzaje jego parametru vararg mogą być różne. Dodając inne parametry. Przykład metody przeciążania varargs
Varargs i przeciążanie niejednoznaczności
W niektórych przypadkach wywołanie może być niejednoznaczne, podczas gdy mamy przeciążoną metodę varargs. Zobaczmy przykład
W tym programie, gdy wywołujemy metodę displayData () bez żadnego parametru, generuje błąd, ponieważ kompilator nie jest pewien, czy to wywołanie metody jest dla
displayData(String ... values)
czydisplayData(int ... values)
Taki sam sposób, jeśli mamy przeciążone metody, w których jedna ma
vararg
metodę jednego typu, a inna metoda ma jeden parametr ivararg
parametr tego samego typu, wówczas mamy również dwuznaczność - As Exp -displayData(int ... values)
idisplayData(int a, int ... values)
Te dwie przeciążone metody zawsze będą niejednoznaczne.
źródło
To jest Java sposób przekazywania varargs (argumenty o zmiennej liczbie).
Jeśli znasz C, jest to podobne do
...
używanej składniprintf
:ale w sposób bezpieczny: każdy argument musi być zgodny z określonym typem (w twojej próbce powinny być wszystkie
String
).Oto prosta próbka użycia varargs :
...
Argument jest rzeczywiście tablicą, więc można przekazaćString[]
jako parametr.źródło
Prawdopodobnie jest to przykład cukru syntaktycznego, ponieważ i tak jest on zaimplementowany jako tablica (co nie znaczy, że jest bezużyteczny) - wolę przekazywać tablicę, aby była czysta, a także deklarować metody z tablicami danego typu. Jednak raczej opinia niż odpowiedź.
źródło
Aby rzucić nieco światła, ważne jest, aby wiedzieć, że parametry var-arg są ograniczone do jednego i nie można mieć kilku parametrów var-art. Na przykład jest to nielogiczne:
źródło
Pomyśl o tym jako o słowie kluczowym
params
w C #, jeśli pochodzisz z tego tła :)źródło
Naprawdę powszechny sposób, aby zobaczyć wyraźny przykład użycia trzech kropek, który jest obecny w jednej z najbardziej znanych metod w AndyncTask Androida (który dziś nie jest zbyt często używany z powodu RXJAVA, nie wspominając o komponentach architektury Google), możesz znaleźć tysiące przykładów szukających tego terminu, a najlepszym sposobem na zrozumienie i nigdy nie zapomnienie znaczenia trzech kropek jest to, że wyrażają one ... wątpliwości ... tak jak we wspólnym języku. Mianowicie nie jest jasne, ile parametrów musi zostać przekazanych, może wynosić 0, może być 1 może być więcej (tablica) ...
źródło
String...
jest taki sam jakString[]
źródło
String...
to to samoString[]
, czy nie możesz tak po prostu powiedzieć?String[]
wymaga argumentu (przynajmniej pustej tablicy), podczasString...
gdy nie (patrz odpowiedź powyżej).Dodając do innych dobrze napisanych odpowiedzi, zaletą, która
varagrs
uważam za przydatną, jest to, że kiedy wywołuję metodę z tablicą jako typ parametru, eliminuje to ból związany z tworzeniem tablicy; dodaj elementy, a następnie wyślij je. Zamiast tego mogę po prostu wywołać metodę z dowolną liczbą wartości; od zera do wielu.źródło
Przykład 1:
Przykład 2:
źródło
Składnia: (Potrójna kropka ...) -> Oznacza, że możemy dodać zero lub więcej obiektów przekazanych w argumentach lub przekazać tablicę typu obiektowego.
Definicja: 1) Argument Object ... jest po prostu odniesieniem do tablicy Objects.
2) („String []” lub String ...) Może obsłużyć dowolną liczbę obiektów string. Wewnętrznie wykorzystuje tablicę obiektu typu referencyjnego.
3) Jeśli chcesz wywołać metodę z jednym argumentem i okazuje się, że jest to tablica, musisz jawnie ją owinąć
Zastosowanie: Używany głównie, gdy liczba argumentów jest dynamiczna (liczba argumentów znana w czasie wykonywania) i podczas zastępowania. Ogólna zasada - w metodzie możemy przekazać dowolne typy i dowolną liczbę argumentów. Nie możemy dodawać argumentów obiektowych (...) przed żadnymi konkretnymi argumentami. to znaczy
źródło