[英]Simplifying Java method with variable amount of arguments
在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);
其中每個都將進入頂部的polygon命令。 我面臨的問題是,當mypoly被創建時,它如何知道要添加多少點以及放置它們的位置?
我試圖讓myCommand
在添加參數時自動添加點,並且每個點與原始多邊形創建方法的x,y相對應。
聽起來你需要使用構建器模式。 在偽代碼中:
PolygonBuilder pb = new PolygonBuilder();
pb.addPoint(1,1);
pb.addPoint(1,2);
// etc...
Polygon p = pb.newPolygon();
所以我們的想法是為構建器提供一組點,它會生成適當的多邊形。 建築商通常設計有流暢的界面 。 請注意,構建器可以像工廠一樣工作,並返回適當的Polygon
子類(正方形,三角形,pentagle等,如果您願意的話)。
請注意,您可以使用Java varargs機制提供一個采用可變數量參數的方法。 例如
public void addPoints(Integer... args) {
// and iterate here
}
您可能希望創建一個Point
對象來一起定義x / y坐標。 否則上面的內容必須檢查偶數個參數,並且這些參數不會綁在一起。
您可以使用varargs並使用獲取xs和ys數組的構造函數動態創建多邊形
(代碼未經測試)
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);
為了擴展Brian Agnew的答案,可能還需要添加一個addPoints方法可以接受的Point類。它可以使從多邊形中添加/刪除點稍微容易一些。
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
}
我想你可以使用一種接收varargs的方法( ...
)
每個點都需要一個包裝器:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.