如何在应用程序的体系结构和类方面正确组织两个枚举的结构,它们之间具有多对多的关系?

Fra*_*ète 7 java architecture oop enums entity-relationship

我有枚举CarBrand:

public enum CarBrand {
    BMW, MERCEDES, VOLKSWAGEN, AUDI, FORD, OPEL
}
Run Code Online (Sandbox Code Playgroud)

和枚举CarBodyType:

public enum CarBodyType {
    SEDAN, MINIVAN, VAN
}
Run Code Online (Sandbox Code Playgroud)

他们之间的关系很多很多.即一个汽车品牌可以有几种车身类型,而车身类型有几个品牌.

如何使用这些枚举在我的代码中定义这样的实体关系模型?

也许我需要在每个枚举中使用make字段作为由另一个枚举参数化的集合?

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

public enum CarBodyType {
    SEDAN, MINIVAN, VAN;

    private Set<CarBrand> brands;

    // getter and setter
}
Run Code Online (Sandbox Code Playgroud)

这是一个好的解决方案吗?或者通过第三个交叉点实体实现这种关系会更好吗?如果是这样,应该是什么?该实体应该如何设计以及它应包含哪些字段?

Law*_*Dol 4

几乎可以肯定,某种体型“拥有”品牌是不正确的。一个品牌“有”一种体型很可能是不正确的。您最可能想要建模的是每个品牌允许的体型的一组单独的交集。

您最有可能想要一个Vehicle具有体型和品牌的产品:

public class Vehicle 
{
    private CarBrand brand;
    private CarBodyType body;
    ...
}
Run Code Online (Sandbox Code Playgroud)

并创建车辆,每个车辆模型一种组合。

回应评论

比如说这个案例呢?如果 Book 和 Author 是枚举。

我认为书籍/作者的示例不适用于枚举(也许您对枚举的使用是问题的核心)。书籍和作者的数量不限;您不会使用封闭集枚举来对书籍或作者进行建模。更进一步,确实,每本书都有一个或多个作者,而每个作者只是在写过一本或多本书的情况下才是作者(否则他们只是一个渴望成为作家的人)。

在书籍和作者的关系建模中,您将拥有一个Book表、一个Author表和一个单独的关系表,其中的关系表是和表BookAuthor的外键的结合。在对象术语中,将“表”一词更改为“对象”,尽管在对象模型中,您可能会将“表”替换为每本书中的一组作者和/或每个作者中的一组书籍。BookAuthorBookAuthor