[英]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;
}
}
最后用你现有的点p1
, p2
, 3
创建你的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.