簡體   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