首页 > 解决方案 > 从另一个构造函数调用默认构造函数

问题描述

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

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

标签: java

解决方案


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

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

最后Triangle用你现有的点创建你喜欢的东西p1, p2, 3:

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

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


推荐阅读