【问题标题】:Simplifying Java method with variable amount of arguments使用可变数量的参数简化 Java 方法
【发布时间】:2012-12-09 03:39:23
【问题描述】:

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

【问题讨论】:

标签: java methods polygon


【解决方案1】:

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

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

Polygon p = pb.newPolygon();

所以想法是您为构建器提供一组点,它会为您生成适当的多边形。构建器通常使用fluent interface 设计。请注意,构建器可以像工厂一样为您返回Polygon 的适当子类(如果您愿意,可以使用正方形、三角形、五角形等)。

请注意,您可以改为使用Java varargs mechanism 提供一个采用可变数量参数的方法。例如

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

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

【讨论】:

    【解决方案2】:

    您可以使用 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);

    【讨论】:

    • +1 此页面上的所有答案在技术上都是正确的,但这个得到了我的支持,因为它提到了可变参数(最佳答案)并且不会混淆琐事。
    • 可以使用for (int i = 0; i &lt; points.length; i += 2) 代替i++ 来简化for 循环。这样你就可以摆脱令人困惑的i * 2数学。
    • 那么 xs 和 ys 的索引是多少?
    【解决方案3】:

    我认为您可以使用接收可变参数 (...) 的方法

    每个点都需要一个包装器:

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

    【讨论】:

    • java.awt.Point 已经存在(从 1.0 开始)。无需重新发明轮子。
    【解决方案4】:

    为了扩展 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
    }
    

    【讨论】:

    • java.awt.Point 已经存在(从 1.0 开始)。无需重新发明轮子。
    • 我通常会同意,但是对于这种情况,使用不可变点类是有一定意义的,而且由于它使用泛型,因此该代码可在许多其他应用程序中重用。
    • 也许将类命名为ImmutablePoint 以区分它并使代码更好地描述意图?
    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多