2012-12-15 47 views
7

我有枚舉CarBrand如何根據應用程序的體系結構和類正確地組織兩個枚舉的結構,以及它們之間的多對多關係?

public enum CarBrand { 
    BMW, MERCEDES, VOLKSWAGEN, AUDI, FORD, OPEL 
} 

和枚舉CarBodyType:它們之間

public enum CarBodyType { 
    SEDAN, MINIVAN, VAN 
} 

關係是多對多。即一個汽車品牌可以有多種車身類型,而一個車身類型有多個品牌。

如何用這些枚舉在我的代碼中定義這樣的實體關係模型?

也許我需要使每個枚舉中的字段作爲由另一個枚舉參數化的集合?

public enum CarBrand { 
    BMW, MERCEDES, VOLKSWAGEN, AUDI, FORD, OPEL; 

    private Set<CarBodyType> bodyTypes;   

    public Set<CarBodyType> getBodyTypes() { 
     return bodyTypes; 
    } 

    public void setBodyTypes(Set<CarBodyType> bodyTypes) { 
     this.bodyTypes = bodyTypes; 
    } 
} 

public enum CarBodyType { 
    SEDAN, MINIVAN, VAN; 

    private Set<CarBrand> brands; 

    // getter and setter 
} 

這是一個很好的解決方案嗎?或者,通過第三個交匯點實體來實施這種關係會更好嗎?如果是這樣,它應該是什麼?該實體應該如何設計,它應包含哪些領域?

回答

4

身體型「擁有」品牌幾乎肯定是不正確的。品牌「有」一種體型很可能不是真的。您最可能想要建模的是每個品牌允許的身體類型的單獨交集。

這是你最有可能想要一個Vehicle具有身體類型和品牌:

public class Vehicle 
{ 
    private CarBrand brand; 
    private CarBodyType body; 
    ... 
} 

,並創建車輛每個一個組合模型。

在迴應評論

例如怎麼樣this case?如果書和作者是枚舉。

我不認爲書/作者的例子適用於枚舉(也許你使用枚舉是問題的核心)。書籍和作者的數量是開放式的;您不會使用封閉式枚舉對書籍或作者建模。更重要的是,每本書都有一個或多個作者,而每個作者只是作者在寫作一本或多本書的環境中(否則他們只是一個渴望成爲作者的人)。

在圖書和作者的關係建模你將有一個Book表,Author表和BookAuthor這是外鍵的BookAuthor表的結合一個單獨的關係表。用對象術語將「table」改爲「object」,儘管在對象模型中,您可能會用每本書中的一組作者和/或每個作者中的一組書籍替換BookAuthor「表」。

+0

@Bhesh:除了可以說Minivan和一輛貨車不是汽車之外......我用Vehicle來突出這個OP。我認爲在這個級別上的錯誤是他/她使用「Car」。 –

+0

謝謝!這是唯一的解決方案?總是需要創建第三個結點實體?或者我只是選擇了不是最好的樣本?例如[這個案例](http://en.wikipedia.org/wiki/Many-to-many_(data_model))呢?如果'Book'和'Author'是枚舉。您的解決方案是否也適用於此示例?還是僅僅是針對我的具體情況? –

0

有這樣的循環依賴是不好的做法。

如果您需要保持這種關係,請將其保存在單獨的類中,避免循環。

0

然後你的CarBrand類似乎是一個更復雜的結構,即枚舉。它可以是仍然是一個價值型與某種身份的地圖裏面,但:

class CarBrand { 

    static Set<CarBrand> AllBrands; //replacement for CarBrand enum 
    static Set<CarBodyType> GetTypes(CarBrand brand) { /* search this.AllBrands here */} 
    static Set<CarBrand> GetBrands(CarBodyType type) { /* search this.AllBrands here */} 

    /*specify types per brand */ 
    Set<CarBodyType> bodyTypes; 
} 

如果你喜歡去與CarBrand枚舉,這是可以也做了明確作爲第三關係結構。介紹關聯類:

class CarBrandTypePair { 
    CarBrand, CarBodyType, 
} 

,其餘應如上CarBrand樣品的靜態部分。

第一種方式可能更具可擴展性:您將來會添加其他品牌的特定功能。用第二種方法,你會添加更多和更簡單的關聯。

相關問題