Pytanie o trzy kropki w argumentach konstruktora

0

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?

0

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.

0

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

0
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.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1