簡體   English   中英

使用可變數量的參數簡化Java方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM