使用变量量简化Java方法

使用变量量简化Java方法,java,methods,polygon,Java,Methods,Polygon,在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, y

在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相对应。

听起来您需要使用该模式。在伪代码中:

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

Polygon p = pb.newPolygon();
因此,我们的想法是为构建器提供一组点,它将生成相应的多边形。建设者通常被设计成具有一个简单的结构。请注意,构建器可以像工厂一样返回
多边形的适当子类(正方形、三角形、五角星形等,如果您愿意)

请注意,您可以使用提供一个接受可变数量参数的方法。e、 g

您可能希望创建一个
对象来一起定义x/y坐标。否则,上述参数将必须检查偶数个,并且这些参数将不会绑定在一起。

您可以使用获取xs和ys数组的来动态使用和创建多边形

(代码未测试)

公共多边形createPolygon(int…点){ 如果(0!=点数。长度%2){ 抛出新的IllegalArgumentException(“必须有偶数点”); } int numOfPoints=points.length/2; int xs=新的int[numOfPoints]; int ys=新的int[numOfPoints]; 对于(int i=0;i
然后,您可以使用任意数量的点调用该方法


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

我认为您可以使用接收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);

为了扩展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;}
}
公共最终课程点{
私人决赛X X;
私人决赛;
公共点(X,Y,Y){
这个.x=x;
这个。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
}
public void addPoints(点…点){
用于(点:点)
//你的逻辑
}

使用。已存在(自1.0起)。无需重新发明轮子。我通常会同意,但在这种情况下,使用不可变点类是有一定意义的,并且此代码在许多其他应用程序中是可重用的,因为它使用泛型。也许可以命名该类
ImmutablePoint
,以区分它,并使代码更好地描述其意图?已存在(自1.0起)。不需要重新发明轮子。+1本页上的所有答案在技术上都是正确的,但这一个得到了我的支持,因为它只提到了varargs(最佳答案),并且没有把琐事弄得乱七八糟。for循环可以通过使用
for(int i=0;i
而不是
i++
来简化。通过这种方式,您可以摆脱令人困惑的
i*2
数学。那么xs和ys的索引是什么?
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
}