簡體   English   中英

這是組合關系的例子嗎?

[英]Is this an example of a composition relationship?

class Polygon {
    private final LinkedHashSet <Line> polygon;
    private int objID;
    private static int classID;
    Iterator <Line> it;

    public Polygon(LinkedHashSet<Line> polygon) {
        this.polygon = new LinkedHashSet<Line>();
        for(Line l: polygon)
            this.polygon.add (l);
        objID = ++ classID;
        it = this.polygon.iterator();
    }
}


class Line {
    Point start, end;

    public Line(Point a, Point b){
        start = a;
        end = b;
    }
}

在我的理解中,當我們在整體中構建部分object 時,這種關系是組合,這導致部分與整體一起被破壞。

在這種情況下,因為我們將新數據分配到多邊形 LinkedHashSet 並在構造函數中深度復制 Line 對象,是否可以安全地假設這是 Polygon(作為整體)和 Line(作為部分)之間的組合關系? 在這種情況下,當 object 被銷毀時, polygon變量中的數據肯定會被銷毀。

像這樣的東西

composition ,或者更准確地說是composite aggregation ,意味着對組合對象的生命周期有排他性的所有權和控制權。

您的初始代碼

鑒於 Java 的引用分配原則, PolygonLine元素很可能在多個多邊形之間共享。 也許他們不是,但不能保證獨家所有權。

因此,在您的 UML 圖中,您可以考慮共享聚合,這通常被理解為沒有排他性要求的失敗者部分-整體聚合。 但是當前的 UML 規范不再定義共享聚合的語義。 所以在實踐中,我會推薦一個簡單的關聯,具有明確的語義。

您編輯的問題

如果您要進行深度復制,包括克隆每個輸入Line ,您將有理由保證該行不會從其他地方重用:

class Polygon {
    ...
    public Polygon(Collection<Line> polygon) {
        this.polygon = new LinkedHashSet<Line>();
        for(Line l: polygon)
            this.polygon.add (l.clone());
        objID = ++ classID;
        it = this.polygon.iterator();
    }
}
class Line {
    ...
    public Line(Point a, Point b){
        ...
    }
    public Line clone() {
        return (new Line(start, end)); 
    }
}

然后,您還應該通過確保從不從任何方法返回線而只從多邊形返回克隆來防止泄漏多邊形的線。 在這種情況下,復合聚合是正確的。

無關:您的構造函數似乎泄露了一些實現細節。 是否有理由使用LinkedHashSet<Line>參數而不是更通用的Collection<Line>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM