簡體   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