4

目前,我们有一个业务实体可以表示为枚举或类。

类实现更简单,业务逻辑更清晰。但是有 50% 的可能性是需求会发生变化,而枚举表示将使我们的生活更轻松。

具体例子

实体具有标题和颜色。颜色是可编辑的,所以有两种方法

  1. 实体是一个枚举 - 有另一个类具有从实体到其颜色的映射。
  2. entity 是一个类 - 只是一个颜色字段,没有问题。

未来的变化要求——应该有与每个实体相关的规则

  1. entity 是一个枚举——规则是硬编码在代码中的
  2. 实体是一个类 - 需要更多的映射类以及允许用户指定它们的 UI。

如果规则集是静态的,则第二个选项是矫枉过正。

那么,如果我们需要将类转换为枚举,对这个过程有什么建议吗?

编辑

实体集是有限的,用户不太可能更改。

先感谢您。

4

4 回答 4

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
{......}

这将允许您将所有数据存储在同一个表中,并且还允许您基于对象识别数据。

于 2012-10-10T08:00:17.887 回答
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;
            }
        }
    }
于 2012-10-10T08:03:31.010 回答
1

如果它有任何可编辑的东西,那么无论如何你都需要一个实体类,所以首先选择实体类。

如果您以后需要实现一组固定的规则,请将它们实现为具有硬编码规则的枚举,并在您的实体类上添加一个映射到该枚举的字段。

您可以像这样在实体字段上映射枚举:

enum MyRule {
    RULE1, RULE2;
    // implement hard-coded rule
}

@Entity
class Myentity {
    @Enumerated(/* optionally specify EnumType, default is ordinal */)
    @Column
    MyRule rule;
}
于 2012-10-10T08:06:55.247 回答
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"; }

}
于 2012-10-10T08:16:53.127 回答