根据输入长度调用正确的构造函数

时间:2014-05-28 15:40:20

标签: java constructor compiler-errors

我有一个Point课程。

这一点可以是2-D和3-D。我根据传递给构造函数的坐标数组的长度来决定这个。

    double x, y, z;
    int dimension;
    Point(double x, double y, double z) {
        this.x = x;
        this.y = y;
        this.z = z;
        dimension = 3;
    }
    Point(double x, double y) {
        this.x = x;
        this.y = y;
        this.z = 0;
        dimension = 2;
    }
    Point(double[] p)
    {
        if(p.length == 2)
            this(p[0], p[1]);
        else if(p.length == 3)
            this(p[0], p[1], p[2]);
    }

最后一个构造函数给出错误,因为构造函数调用必须是构造函数中的第一个语句。

有没有办法实现我的目标?

3 个答案:

答案 0 :(得分:2)

可能你可以做点什么

double x, y, z;
int dimension;
Test(double x, double y, double z) {
    initDim(x, y, z);
}
Test(double x, double y) {
    initDim(x, y);
}
Test(double[] p)
{
    if(p.length == 2)
        initDim(p[0], p[1]);
    else if(p.length == 3)
        initDim(p[0], p[1], p[2]);
}
private void initDim(double x, double y, double z) {
    this.x = x;
    this.y = y;
    this.z = z;
    dimension = 3;
}

private void initDim(double x, double y) {
    initDim(x, y, 0);
    dimension = 2;
}

答案 1 :(得分:1)

除了那些我想建议这样的解决方案。较少的构造函数和易于适应性。与你创建单身人士的行为类似。

public class Point {
    double x, y, z;
    int dimension;

    private Point(double x, double y, double z) {
        this.x = x;
        this.y = y;
        this.z = z;
        dimension = 3;
    }

    private Point(double x, double y) {
        this.x = x;
        this.y = y;
        this.z = 0;
        dimension = 2;
    }

    public Point getInstance(double x, double y, double z) {
        return new Point(x, y, z);
    }

    public Point getInstance(double x, double y) {
        return new Point(x, y);
    }

    public Point getInstance(double[] p) {
        if (p.length == 2)
            return new Point(p[0], p[1]);
        else (p.length == 3)
            return new Point(p[0], p[1], p[2]);         
    }
}

您可以像这样创建实例。

Point point = Point.getInstance(0, 0);

答案 2 :(得分:0)

拥有太多构造函数通常并不好。它为您提供了表达如何使用它的好机会。

public static Point Create(double... p)
{
    if(p.length == 2)
        return Point(p[0], p[1]);
    else if(p.length == 3)
        return Point(p[0], p[1], p[2]);

    // default case or throw error
}

或者,您可以创建一个initialize方法,您可以从构造函数中调用它。