Java promenljivi broj parametara, 5 minuta da naučim moju sestru
Da bi moji verni poklonici mogli dobiti Alibaba cloud server besplatno, radio sam kao korisnički službenik cele dva dana, zaista sam osetio teškoću i bol „davanja dobrobiti narodu“. Upravo kad su mi oči crvenele i hteo sam da odmorim, Sanmej je došla i pitala: „Kako uopšte funkcionišu promenljivi brojevi parametara u Javi?“ Odmah sam se probudio, volim Javu, volim da podučavam i rešujem dileme, i uživam u Sanmejinoj odobravi (😂).
Promenljivi broj parametara je funkcija uvedena u Javi 1.5, omogućava metodama korišćenje bilo koliko parametara istog tipa (is-a) kao argumente. Kao ovako.
public static void main(String[] args) {
print("Chen");
print("Chen", "Mo");
print("Chen", "Mo", "Wang");
print("Chen", "Mo", "Wang", "Er");
}
public static void print(String... strs) {
for (String s : strs)
System.out.print(s);
System.out.println();
}Statička metoda print() koristi promenljivi broj parametara, zato print("Chen") može, print("Chen", "Mo") takođe može, čak 3, 4 ili više stringova mogu se proslediti print() metodu kao parametri.
Kad govorimo o promenljivom broju parametara, setih se da u Alibaba razvojnom priručniku postoji jedno pravilo.

Znači što manje koristite promenljivi broj parametara, ako koristite, mora biti na poslednjem mestu liste parametara. Pošto su mesta ograničena i može biti samo na kraju, promenljivi broj parametara može biti samo jedan (oprezno, oprezno). Ako promenljivi broj parametara nije na poslednjem mestu, IDE će prikazati odgovarajuću grešku, kao što je prikazano ispod.

Promenljivi broj parametara izgleda kao sintaktički šećer, šta se zapravo krije iza njega? Hajde da istražimo, na putu ka istini moramo biti uporni.
Zapravo je vrlo jednostavno. Kada koristite promenljivi broj parametara, prvo se kreira niz, veličina niza je broj promenljivih parametara, zatim se stavljaju parametri u niz, i na kraju se niz prosleđuje pozvanom metodu.
Zato ovaj metod može biti pozvan nizom kao parametar. Kod je prikazan ispod.
public static void main(String[] args) {
print(new String[]{"Chen"});
print(new String[]{"Chen", "Mo"});
print(new String[]{"Chen", "Mo", "Wang"});
print(new String[]{"Chen", "Mo", "Wang", "Er"});
}
public static void print(String... strs) {
for (String s : strs)
System.out.print(s);
System.out.println();
}Ako je parametar metoda niz, a pozivamo metod kao sa promenljivim brojem parametara, da li to može raditi?
„Sanmej, ostavio sam ti jedno razmišljanje: kad se obično koristi promenljivi broj parametara?“
Promenljivi broj parametara, kako ime kaže, kada metod treba da obrađuje bilo koliko objekata istog tipa, možete definisati promenljivi broj parametara. U Javi postoji dobar primer, to je format() metod String klase, kao ovako.
System.out.println(String.format("Starost je: %d", 18));
System.out.println(String.format("Starost je: %d Ime je: %s", 18, "Chenmo Wang Er"));%d znači formatiranje celog broja u decimalni, %s znači ispis stringa.
Ako ne koristite promenljivi broj parametara, parametre treba formatirati povezivanjem „+“ operatora. Teškoće će se pojaviti.
U stvarnom projektu kodu, slf4j log izlaz često koristi promenljivi broj parametara (log4j ne može koristiti promenljivi broj parametara, kada log treba zabeležiti više parametara je vrlo bolno). Kao ovako.
protected Logger logger = LoggerFactory.getLogger(getClass());
logger.debug("Ime je{}", mem.getName());
logger.debug("Ime je{}, Starost je{}", mem.getName(), mem.getAge());Pogledajmo izvorni kod, možete videti da debug() metod koristi promenljivi broj parametara.
public void debug(String format, Object... arguments);„Postoji li nešto na šta treba obratiti paznju pri korišćenju promenljivog broja parametara?“ Sanmej pita.
Postoji. Trebamo izbegavati preklapanje metoda s promenljivim brojem parametara——lako može dovesti kompajler u sumnju.
public static void main(String[] args) {
print(null);
}
public static void print(String... strs) {
for (String a : strs)
System.out.print(a);
System.out.println();
}
public static void print(Integer... ints) {
for (Integer i : ints)
System.out.print(i);
System.out.println();
}U ovom trenutku, kompajler uopšte ne zna koju print() metod pozvati, print(String... strs) ili print(Integer... ints), ne može razlikovati.

Ako zaista treba preklopiti metod s promenljivim brojem parametara, morate dati jasan pokazatelj pri pozivanju metoda, ne ostavljajte kompajler da pogađa.
public static void main(String[] args) {
String [] strs = null;
print(strs);
Integer [] ints = null;
print(ints);
}
public static void print(String... strs) {
}
public static void print(Integer... ints) {
}Gornji kod se može uspešno kompajlirati. Jer kompajler zna da li je parametar String ili Integer tip, samo da bi se izbeglo bacanje NullPointerException u vreme izvršenja, obe print() metode moraju unutra dobro proveriti null.
„Dobro, o promenljivom broju parametara ćemo za sada ovoliko. Sanmej, sve razumeš?“
„Mm-m, nije teško, razumela sam, brate.“ Sanmej je stvarno u dobrom stanju učenja, može se videti da je ozbiljno beleži beleške📒.
