目前,我们有一个业务实体可以表示为枚举或类。
类实现更容易,使业务逻辑更清晰。但是,有50%的概率可以改变要求,而枚举代表将使我们的生活更轻松。
具体例子
实体具有标题和颜色。颜色是可编辑的,所以有两种方式
未来的变更要求 - 应该有与每个实体相关的规则
如果规则集是静态的,则第二个选项是过度杀伤。
因此,如果我们需要将类转换为枚举,是否有关于此过程的任何建议?
修改
实体集是有限的,不太可能被用户更改。
提前谢谢。
答案 0 :(得分:1)
假设Entity
表示JPA entities.
您可以使用enum
返回到外面的世界和内部实体,您可以拥有代表它的属性。
@Entity
class Entity {
@Column
Integer ruleIndex = 0;//Illustration purpose only
public Color getColor() {
// ruturn color based on rule that will be applied by ruleindex
}
}
enum Color {
BLUE(0), BLACK(1), WHITE(2);
private int ruleIndex = 0;
private Color(int ruleIndex) {
this.ruleIndex = ruleIndex;
}
}
<强>更新强>
不建议将枚举用作实体。相反,您可以使用单继承策略
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DISC", discriminatorType=STRING,length=20)
public class Color
{......}
@Entity
@DiscriminatorValue("Blue")
public class Blue extends Color
{......}
@Entity
@DiscriminatorValue("Green")
public class Green extends Color
{......}
这将允许您将所有数据存储在同一个表中,并允许您根据对象识别数据。
答案 1 :(得分:1)
如果您想要枚举中的某些功能以及类中的某些功能,那么您可以使用以下功能:
public class ColoredTitle
{
private String color;
private Title title;
public ColoredTitle(String color, Title title)
{
this.color = color;
this.title = title;
}
public String getColor()
{
return color;
}
public void setColor(String color)
{
this.color = color;
}
public String getHeading()
{
return title.heading;
}
enum Title
{
FRONT_PAGE("Front Page"),
FOOTER_TITLE("Footer Title");
private String heading;
Title(String title)
{
this.heading = title;
}
}
}
答案 2 :(得分:1)
如果它有任何可编辑的东西,那么无论如何你都需要一个实体类,所以首先去实体类。
如果您以后需要实现一组固定的规则,请将它们作为带有硬编码规则的枚举实现,并在实体类中添加映射到该枚举的字段。
您可以在实体字段上映射枚举,如下所示:
enum MyRule {
RULE1, RULE2;
// implement hard-coded rule
}
@Entity
class Myentity {
@Enumerated(/* optionally specify EnumType, default is ordinal */)
@Column
MyRule rule;
}
答案 3 :(得分:0)
枚举可以像普通类一样使用方法。
public enum Tree {
FIR("Fir Tree"),
BIRCH("Birch Tree");
private String desc;
public Tree(String desc) { this.desc = desc; }
public String getDesc() { return desc; }
public String getRandom() { return "abc"; }
}