繁体   English   中英

从另一个构造函数调用默认构造函数

[英]Calling default constructor from another constructor

我应该使用用户给出的 3 个点创建一个三角形 object,如果三角形不合法,则创建默认三角形。 这是使用默认方法创建默认方法的“合法”方式,还是这是一种奇怪的场景,不是人们做事的方式?

public class Triangle

private Point _point1;
private Point _point2;
private Point _point3;

public Triangle()
{
    _point1 = new Point(1,0);
    _point2 = new Point(-1,0);
    _point3 = new Point(0,1);
}

public Triangle(Point point1,Point point2,Point point3)
{
    if (isLegal(point1,point2,point3))
        {
        _point1 = new Point(point1);
        _point2 = new Point(point2);
        _point3 = new Point(point3);
        }
    else
        new Triangle();
}

你可以有多个构造函数,一个构造函数可以调用另一个。 这称为构造函数链接。

在构造函数中使用 this() 来引用相同 class 的另一个构造函数。 使用 super() 来引用超类的构造函数。 您传递给此的 arguments 或超级决定调用哪个构造函数。

创建一个主构造函数,它包含您需要的所有 arguments。 然后,您可以拥有调用另一个构造函数的辅助构造函数,并传入默认值。

对 this() 或 super() 的调用必须是构造函数中的第一条语句。 这是您想要做的问题。 与构造分开处理验证可能会更好。

你可以像这样解决你的问题(代码清理了一点):

public class Triangle {
    private final Point point1;
    private final Point point2;
    private final Point point3;

    public Triangle() {
        this(new Point(1, 0), new Point(-1, 0), new Point(0, 1));
    }

    public Triangle(Point point1, Point point2, Point point3) {
        if (!isLegal(point1, point2, point3)) {
            throw new IllegalArgumentException("Points are illegal");
        }
        this.point1 = point1;
        this.point2 = point2;
        this.point3 = point3;
        // or if you need a copy constructor
        // this.point1 = new Point(point1);
        // this.point2 = new Point(point2);
        // this.point3 = new Point(point3);
    }

    public static boolean isLegal(Point point1, Point point2, Point point3) {
        // some magic calculations
        return result;
    }
}

最后用你现有的点p1p23创建你的Triangle

final Triangle t = Triangle.isLegal(p1, p2, p3) ? new Triangle(p1, p2, p3) : new Triangle();

或者

Triangle t;
if(Triangle.isLegal(p1, p2, p3)) {
    t = new Triangle(p1, p2, p3);
} else {
    t = new Triangle();
}

static 方法isLegal用于在调用构造函数之前检查您的参数。 构造函数内部的检查确保了具有三个点的构造函数没有与非法的 arguments 一起使用。 如果给定点是“非法的”,则抛出异常并退出您的应用程序,如果它没有在某处被捕获(谷歌:java 异常)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM