繁体   English   中英

将枚举转换为类,反之亦然

[英]Convert enum to class and vice versa

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

类实现更容易,并使业务逻辑更清晰。 但是有50%的概率可以改变要求,而枚举代表将使我们的生活更轻松。

具体例子

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

  1. entity是一个枚举 - 还有另一个类,从实体到它的颜色。
  2. 实体是一个阶级 - 只有一个颜色的fiels,没有问题。

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

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

如果规则集是静态的,则第二个选项是过度杀伤。

因此,如果我们需要将类转换为枚举,是否有关于此过程的任何建议?

编辑

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

先感谢您。

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

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

如果您想要枚举中的某些功能和类中的某些功能,那么您可以使用以下各项的混合:

  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;
            }
        }
    }

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

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

您可以在实体字段上映射枚举,如下所示:

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

@Entity
class Myentity {
    @Enumerated(/* optionally specify EnumType, default is ordinal */)
    @Column
    MyRule rule;
}

枚举可以像普通类一样使用方法。

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"; }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM