[英]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.