2012-12-21 14 views
7

Pracując w java, chciałem uprościć funkcję rysowania (twórca wielokątów), z którym pracuję. Zazwyczaj podczas tworzenia wielokąta, to zrobić:Uproszczenie metody Java ze zmienną ilością argumentów

Polygon mypoly = new Polygon(); 
mypoly.addPoint(x1, y1); 
mypoly.addPoint(x2, y2); 
mypoly.addPoint(x3, y3); 
Draw.fillPolygon(g, mypoly, Color.blue); 

Chciałbym użyć mapowania obrazu automatycznie dać mi współrzędne, więc może po prostu skopiować wkleić je do własnej funkcji.

myCommand(x1, y1, x2, y2, x3, y3); 

Każda z nich trafi do polecenia wielokąta u góry. Problem, z którym się borykam, polega na tym, że kiedy powstanie mypoly, skąd będzie wiedzieć, ile punktów dodać i gdzie je umieścić?

Próbuję uzyskać myCommand, aby automatycznie dodawać punkty podczas dodawania argumentów, a każdy punkt odpowiadający X, Y oryginalnej metody tworzenia wielokąta.

+1

Użyj [varargs] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) . –

Odpowiedz

7

Wygląda na to, że trzeba użyć wzoru builder. W Pseudokod:

PolygonBuilder pb = new PolygonBuilder(); 
pb.addPoint(1,1); 
pb.addPoint(1,2); 
// etc... 

Polygon p = pb.newPolygon(); 

więc chodzi o to, że podasz budowniczy z kompletem punktów, a będzie to generować Ci odpowiedni wielobok. Konstruktorzy są często projektowani z fluent interface. Zauważ, że budowniczy może działać jak fabryka i zwrócić ci odpowiednie podklasy Polygon (kwadrat, trójkąt, pentagle itp., Jeśli sobie tego życzysz).

Należy zauważyć, że zamiast tego można podać metodę, która pobiera zmienną liczbę argumentów, przy użyciu Java varargs mechanism. na przykład

public void addPoints(Integer... args) { 
    // and iterate here 
} 

Możesz chcieć stworzyć Point obiekt do zdefiniowania X/Y koordynować razem. W innym przypadku powyższe będzie musiało sprawdzić parzystą liczbę argumentów, a te argumenty nie będą ze sobą powiązane.

5

Można użyć varargs i utworzyć wielokąt dynamicznie za pomocą constructor który pobiera tablice xs i ys

(kod nie testowane)

public Polygon createPolygon(int... points) { 
    if (0 != points.length % 2) { 
     throw new IllegalArgumentException("Must have even number of points"); 
    } 

    int numOfPoints = points.length/2; 
    int xs = new int[numOfPoints]; 
    int ys = new int[numOfPoints]; 
    for (int i=0; i < numOfPoints;i++) { 
     xs[i] = points[i*2]; 
     yx[i] = points[i*2 + 1]; 
    } 

    return new Polygon(xs, ys, numOfPOints); 
} 

Następnie można wywołać metodę z dowolnej liczby wskazuje

Polygon p = createPolygon(x1,y1,x2,y2,x3,y3);

+0

+1 Wszystkie odpowiedzi na tej stronie są poprawne pod względem technicznym, ale ten dostaje moją wersję, ponieważ * tylko * wspomina o varargs (najlepsza odpowiedź) i nie porządkuje rzeczy ciekawostkami. – Asaph

+2

Pętla for może być uproszczona za pomocą 'for (int i = 0; i BalusC

+0

i jaki byłby indeks dla xs i ys? –

1

Myślę, że można użyć metody, która otrzymała varar gs (...)

Trzeba otoki dla każdego punktu:

class Point { 
    int x; 
    int y; 
    Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

Metoda może być:

myCommand(Point ... points) 

Na wezwanie

myCommand(new Point(0,0), new Point(1,1), new Point(0,1)); 

I Draw:

Polygon mypoly = new Polygon(); 
for(Point p : points) 
    mypoly.addPoint(p.x,p.y); 
Draw.fillPolygon(g,mypoly,Color.blue); 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html) już istnieje (od 1.0). Nie trzeba ponownie wymyślać koła. – Asaph

+0

Masz rację. –

2

Aby rozszerzyć odpowiedź Brian Agnew, warto byłoby dodać klasę Point, którą może przyjąć metoda addPoints. Może to nieco ułatwić dodawanie/usuwanie punktów z wielokąta.

public final class Point<X,Y>{ 
    private final X x; 
    private final Y y; 

    public Point(X x, Y y){ 
     this.x=x; 
     this.y=y; 
    } 

    public X getX(){return x;} 

    public Y getY(){return y;} 
} 

Wtedy można mieć:

public void addPoints(Point<Integer,Integer>... points){ 
    for(Point<Integer,Integer> point:points) 
     //your logic 
} 
+0

['java.awt.Point'] (http://docs.oracle.com/javase/6/docs/api/java/awt/Point.html) już istnieje (od 1.0). Nie trzeba ponownie wymyślać koła. – Asaph

+0

Zazwyczaj się zgadzam, ale w tym przypadku użycie niezmiennej klasy punktów ma sens, a ten kod jest wielokrotnego użytku w wielu innych aplikacjach, ponieważ używa generycznych. –

+0

Może nazwać klasę 'ImmutablePoint', aby odróżnić ją od kodu i lepiej opisać intencję? – Asaph

Powiązane problemy