我应该使用用户提供的 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();
}
答案 0 :(得分:0)
你可以有多个构造函数,一个构造函数可以调用另一个。这称为构造函数链接。
在构造函数中使用 this() 来引用同一个类的另一个构造函数。使用 super() 来引用超类的构造函数。您传递给 this 或 super 的参数决定调用哪个构造函数。
创建一个主构造函数,它接受您需要的所有参数。然后你可以有二级构造函数调用另一个构造函数,传入默认值。
对 this() 或 super() 的调用必须是构造函数中的第一条语句。这是你想要做什么的问题。将验证与构建分开处理可能更好。
答案 1 :(得分:0)
你可以这样解决你的问题(代码清理了一点):
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
用于在调用构造函数之前检查您的参数。
构造函数内部的检查确保具有三个点的构造函数不会与非法参数一起使用。如果给定的点是“非法的”,则会抛出异常并退出您的应用程序(Google:java 异常)。