2016-07-06 4 views
2

사용자, 계정, 라이센스 등 여러 응용 프로그램이 있습니다. 각 엔티티는 Active, Ok, Suspended, Unverified, PendingPayment, PendingApproval 등과 같은 상태가 있습니다. 엔티티가 사용자가 확인에서 일시 중지됨으로 만 이동할 수 있지만 확인되지 않음에서 일시 중지로 전환 할 수는 없습니다. 이것을 구현하는 가장 좋은 디자인 패턴은 무엇입니까? 나는 주변을 둘러 보았고 그런 문제들에 대한 주 기계를 주로 찾았지만 주 내에서의 사건들을 고려하고 싶지 않기 때문에 너무 복잡해 보인다. 내가 제한하고 싶은 것은 국가의 변화입니다.자바에서 엔티티에 대한 상태 전이를 구현하는 방법은 무엇입니까?

현재로서는 각 치수의 모든 상태를 정의하고 가능한 전환을 나타내는 미리 채워진 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); } } } 

(A JPA의 예로서)하여 DB에 다음지도 난 아무것도 찾지 못했습니다 그 상태 전이 제어를 설명하는 페이지 . – TechCrunch

+0

걱정하지 마십시오. 나는 그것에 대해 작업 중입니다. –

+0

엔티티 중 하나에 대해 12 개의 상태가 있습니다. 스위치가 너무 길어질 수 있습니다. 행렬을 추적하려면 여전히 2D 배열이 필요할 수 있습니다. – TechCrunch

0

열거 형으로 이동하십시오. 어떤 임의의 상태가 모든 엔티티가 많은 두통을 저장을 참조 할 엔티티

  • 싱글 최종 클래스에 대해 설정되지 않도록이 가장 기본적으로,

    1. 타입의 안전을 보장합니다.
    2. 당신이 가장 필요로하는 것, 즉, 그런 다음이 될 수 Active(1), Ok(2), Suspended(3), Unverified(4), PendingPayment(5), PendingApproval(6)

    같은 열거 객체/상수의 생성자 호출을 연속적인 값을 할당하여 구현 될 수있는 상태 변경의 순서 값을 증가시키고 적절한 생성자를 호출하고 엔티티에 다음 상태를 할당하는 데 사용되는 정적 변수로 각 엔티티를 추적합니다. 이 방법은 synchronized 방법으로 수행 할 수 있습니다.

  • +0

    새로운 상태를 소개하면 기존의 동상 사이에 삽입해야 할 수도 있기 때문에 Enum 순서에 의존하고 싶지 않습니다. 기존 상태의 숫자로 뒤죽박죽이되기 때문입니다. 또한 동상은 순수한 주문을 따르지 않을 수도 있습니다. – TechCrunch

    +0

    @TechCrunch이 질문을 제기하면서 기업의 열정을 염두에 두십시오. 가장 중요한 부분은 모든 엔티티가 Enum 전용으로 별도의 파일에서 액세스해야한다는 것입니다. 가능한 가능성을 생각하려고 노력하십시오. 당신이 고려해야 할 상태의 - 아주 낮은, 맞죠? * 열거 파일을 열고 번호 매기기에 상수를 추가하십시오. * –

    +0

    약 10-12 개의 상태가 있으며 약 5-6 개의 엔티티가 있습니다. 나는 모든 응답으로 만들어진 해결책을 찾고 여기에 게시 할 것입니다. 대답 할 시간을내어 주셔서 감사합니다. – TechCrunch

    1

    알렉산더의 제안은만큼 괜찮 :

    • 상태 전환의 복잡성이 하나의 방법으로 관리 할 수 ​​있습니다 당신은 런타임에 새로운 상태를 추가하지 않으

    첫 번째 글 머리표의 경우 상태를 enum이 아닌 Object로 구현할 수 있습니다. 각 객체/상태에는 현재 상태에 따라 전환 할 수 있는지 알려주는 메소드가 있습니다.

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