Czy ktos moglby mi powiedziec jak sie stosuje "..." w konstruktorach?? Chodzi o cos takiego: public Obiekt(String... ?). Potrzebuje zrobic jeden konstruktor, ktory jako argument moze raz wziac 2 stringi, raz inta, stringa i Obiekt itp itd. Moglby ktos mi podac przyklad zastosowania tych trzech kropek?
Trzy kropki nie wystpują tylko w kontruktorach, ale ogólnie w metodach. Oznaczają, że można podać dowolnie wiele argumentów podanego typu.
public void method(String... args) {
if (args.length >=2)
System.out.println(args[0] + ", " + args[1]);
}
A co do Twojego problemu, to musisz zrobić trzy konstruktory:
Klasa(String a, String b)
Klasa(int a)
Klasa(String a, Object b)
...
Ewentualnie:
Klasa(Object...args) i zamiast "int" używać "Integer" a w środku konstruktora sobie sprawdzać czym jest dany argument - ale to brzydkie rozwiązanie.
możesz też potraktować wszystko jako Object i potem rzutować do poszczególnych klas. Typ klasy pobierasz metodą getClass:
public static void f(Object... args){
if(args[0].getClass().getSimpleName().equals("Integer")){
int a=(Integer)args[0];
System.out.println("value: "+a);
}
}
Oczywiście to jest wolniejsze od 3 różnych metod. No i mniej wygodne, bo IDE nie będzie podpowiadało
Razi91 napisał(a)
możesz też potraktować wszystko jako Object i potem rzutować do poszczególnych klas. Typ klasy pobierasz metodą getClass:
public static void f(Object... args){
if(args[0].getClass().getSimpleName().equals("Integer")){
int a=(Integer)args[0];
System.out.println("value: "+a);
}
}
Oczywiście to jest wolniejsze od 3 różnych metod. No i mniej wygodne, bo IDE nie będzie podpowiadało
lepiej: if (args[0] instanceof Integer)
Ale i tak najlepiej stworzyć 3 metody. Jeżeli wszystkie będą miały podobną logikę, to ta logika powinna być w prywatnej metodzie wołanej przez tamte 3.
Konstruktor nie powinien wywoływać metod na obiekcie, który tworzy. Dla przykładu ktoś mógłby np rozszerzyć klasę i nadpisać metodę, z której korzysta konstruktor. Dlatego lepiej stworzyć kilka konstruktorów, a jeżeli ich logika się pokrywa w dużej mierze to można np stworzyć osobny prywatny konstruktor, który unifikuje pozostałe - zresztą jest to rozwiązanie najlepsze.
Edit: Oh źle przeczytałem :P Ale i tak to powyżej jest poprawne.
ZTCW metoda(Typ... parametry) to to samo co metoda(Typ[] parametry), tylko że kompilator automatycznie tworzy ową tablicę, po stronie metody wywołującej.