2016-07-06 16 views
2

ユーザー、アカウント、ライセンスなどのアプリケーションに複数のエンティティがあります。各エンティティには、Active、Ok、Suspended、Unverified、PendingPayment、PendingApprovalなどのステータスが関連付けられています。ユーザーが[OK]から[保留]に移動できるのは未確認の状態から[保留中]に移動できないような別の状態に事前定義された状態です。これを実装するための最良の設計パターンは何でしょうか?私は周りを見回し、主にそのような問題のための状態機械を見つけるが、私は状態の事象を考慮したくないので、これはあまりにも複雑に見える。私が制限したいのは、状態の移行だけです。javaのエンティティのステータス遷移を実装する方法は?

現在のところ、各次元のすべてのステータスを定義し、可能な遷移を表す事前入力の2D配列を使用すると思います。より良いアプローチを探してください。

答えて

4

JPA列挙型で使用できます。下のリンクをご覧ください。 http://tomee.apache.org/examples-trunk/jpa-enumerated/README.html

public enum State { 
    STATE1,STATE2(STATE1),STATE3(STATE1,STATE2); 

    private State[] previousStates; 

    private State(){ 

    } 
    private State(State ...state) { 
     this.previousStates =state; 
    } 

    public State transition(State state) throws Exception { 
     for(State tmp: state.previousStates) { 
      if (this == tmp) { 
       return state; 
      } 
     } 
     throw new Exception("Illegal state"); 

    } 

} 

列挙内の方法の推移を実装することで、あなたは簡単にあなたが右のあなたのセット方法には、この呼び出しを非表示にすることができますし、またそれだけであれば例外をスローしますJPAに列挙のための新しい値を設定することができるようになりますステータスが正しくありません。

+0

を行うことができ、あなたのエンティティで

@Entity public class State { @OneToMany private List<State> permittedNextStates; public isSwitchOk(State nextState) { return permittedNextStates.contains(nextState); } } } 

(JPAの例のように)あなたのDBに以下のマッピング私は何も見つかりませんでした、それ状態遷移制御を説明しているページ。 – TechCrunch

+0

心配しないで私はそれに取り組んでいます:) –

+0

私はエンティティの1つに対して12の状態を持っています。そのため、スイッチのケースが長くなりすぎる可能性があります。私はまだ行列を追跡するために2次元配列が必要かもしれません? – TechCrunch

0

Enumに移動します。いくつかのランダムなステータスがすべてのエンティティは、多くの頭痛を保存するを参照するための実体

  • シングルトン最終クラスに設定されていないので、これは最も基本的に、

    1. 型の安全性を確保します。
    2. あなたが最も必要なこと、つまり、そのようなその後することができ Active(1), Ok(2), Suspended(3), Unverified(4), PendingPayment(5), PendingApproval(6)

    として列挙型のオブジェクト/定数のコンストラクタ呼び出しに連続した値を割り当てることによって実装することができ、状態変化の順序値をインクリメントするために使用される独自の静的変数によって各エンティティごとに追跡され、適切なコンストラクタへの呼び出しを行い、エンティティに次のステータスを割り当てます。これは​​メソッドで行うことができます。

  • +0

    私は新しいステータスを導入すると、既存の彫像の間に挿入する必要があるため、既存の彫像の番号を壊してしまうので、列挙型の注文に頼ることは望ましくありません。また、彫像は純粋な秩序に従わないかもしれません。 – TechCrunch

    +0

    @TechCrunchこの質問を提起していただきたいと思います。一番重要なのは、すべてのエンティティがEnum専用の別ファイルにアクセスする必要があることです。可能性が高いと考えてみてください。あなたが考慮しなければならない状況の - 非常に低い、そうですか? * enumファイルを開き、番号を付けて定数を追加してください。* –

    +0

    私は約10-12のステータスを持ち、私は約5-6のエンティティを持っています。私はすべての回答から作られた解決策を見つけ、ここに投稿します。答える時間をとっていただきありがとうございます。 – TechCrunch

    1

    アレキサンダーの提案は限り罰金です:

    • 状態遷移の複雑さは、単一の方法で管理することができますが、実行時に新しい状態を追加したくない

    最初の箇条書きについては、状態を列挙型ではなくオブジェクトとして実装することを検討することをお勧めします。各オブジェクト/状態には、現在の状態に応じて切り替えることができたかどうかを示すメソッドがあります。

    interface State { 
        boolean isSwitchOk(State currentState); 
    } 
    
    class FinishedState implements State { 
        boolean isSwitchOk(State currentState) { 
         ... 
        } 
    } 
    

    あなたはそれ以外の方法でも同様に、すなわちpreviousStateの代わりにnextStateを実行できます。

    実行時に追加できる状態が必要な場合は、選択したDBにそれらを保持することができます。たとえば、あなたがして

    public class MyEntity { 
    
        private State currentState; 
    
        public void switchTo(State nextState) { 
         if (currentState.isSwitchOk(nextState)) { 
         this.currentState = state; 
         } 
        } 
    } 
    
    関連する問題