2012-12-21 47 views
7

在java中工作時,我想要簡化我正在使用的繪圖函數(多邊形創建器)。通常情況下,當你創建了一個多邊形,你這樣做:使用可變數量的參數簡化Java方法

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

我想用一個圖像映射,自動給我的座標,所以我可以只複製並粘貼到我自己的函數。

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

這些都會進入頂部的多邊形命令。我面臨的問題是,當mypoly被創建時,它如何知道要添加多少點以及將它們放在哪裏?

我想讓myCommand在我添加參數時自動添加點,並且每個點都與原始多邊形創建方法的x,y相對應。

+1

使用[可變參數(http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) 。 –

回答

7

聽起來像你需要使用builder模式。在僞代碼:

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

Polygon p = pb.newPolygon(); 

所以想法是,你提供的建設者與一組點,它會生成適當的多邊形。建築商通常設計有fluent interface。請注意,生成器可以像工廠一樣工作,並返回適當的子類Polygon(正方形,三角形,pentagle等,如果你願意的話)。

請注意,您可以改爲使用Java varargs mechanism來提供一個方法,該方法使用可變數目的參數。例如

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

您可能希望創建一個Point對象來一起定義x/y座標。否則,上述內容將不得不檢查偶數個參數,並且這些參數不會被綁定在一起。

5

您可以使用varargs並通過使用獲得XS的陣列和YS

constructor動態創建多邊形

(代碼未測試)

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); 
} 

然後,你可以用任何數量的調用方法點

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

+0

+1此頁面上的所有答案在技術上都是正確的,但是這個獲得我的讚賞,因爲它*僅*提到可變參數(最好的答案),並且不會讓事情與瑣事混亂。 – Asaph

+2

for循環可以通過'for(int i = 0; i BalusC

+0

以及xs和ys的索引是什麼? –

1

我想你可以使用接到varar的方法GS(...

你需要爲每個點的包裝:

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

的方法可能是:

myCommand(Point ... points) 

對於呼叫

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

而對於平局:

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)已經存在(從1.0開始)。不需要重新發明輪子。 – Asaph

+0

你說得對。 –

2

要擴展Brian Agnew的答案,也許值得添加一個Point類,addPoints方法可以接受。它可以使添加/刪除點的過程稍微簡單一些。

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;} 
} 

然後,你可以有:

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)已經存在(從1.0開始)。不需要重新發明輪子。 – Asaph

+0

我通常會同意,但是對於這種情況,使用不可變的點類有一定的意義,並且此代碼可以在許多其他應用程序中重複使用,因爲它使用泛型。 –

+0

也許命名類ImmutablePoint來區分它,並使代碼更好地描述意圖? – Asaph

相關問題