4

現在、列挙型またはクラスの両方として表すことができるビジネス エンティティがあります。

クラスの実装がより簡単になり、ビジネス ロジックがより明確になります。しかし、50% の確率で要件が変更され、enum 表現によって作業が楽になる可能性があります。

具体例

エンティティにはタイトルと色があります。色は編集可能なので、2つの方法があります

  1. エンティティは列挙型です - エンティティからその色へのマッピングを持つ別のクラスがあります。
  2. エンティティはクラスです-色のフィールドが1つ増えるだけで、問題ありません。

将来の変更要件 - 各エンティティに関連付けられたルールが必要です

  1. エンティティは列挙型です - ルールはコードにハードコーディングされています
  2. エンティティはクラスです - マッピング用にさらにいくつかのクラスが必要であり、ユーザーがそれらを指定できるようにする UI も必要です。

一連のルールが静的である場合、2 番目のオプションはやり過ぎです。

クラスを列挙型に変換する必要がある場合、このプロセスに関する推奨事項はありますか?

編集

エンティティのセットは限られており、ユーザーが変更する可能性はほとんどありません。

前もって感謝します。

4

4 に答える 4

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 に答える
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 に答える
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 に答える