기타/리펙토링

Entity 에서 사용하는 enum -> 리펙토링

oiNeh 2022. 5. 27. 03:58

코드 목적은 

배송 entity에서 배송상태를 보기 위해 

enum 타입으로 Status을 선언 하고

next() 메서드로 상태를 변경할수 있도록 하는 코드 입니다.  

 

변경 전 코드 

    
    private Status status;
    
    private enum Status {
        ACCEPT,         //결제완료
        INSTRUCT,       //상품준비중
        DEPARTURE,      //배송지시
        FINAL_DELIVERY, //배송중
        NONE_TRACKING   //배송완료
    }


    public void updateStatus() {
        // 업데이트 호출하면 자동으로 됨
        if (status == null) {
            status = Status.ACCEPT;
        } else if (status == Status.ACCEPT) {
            status = Status.INSTRUCT;
        } else if (status == Status.INSTRUCT) {
            status = Status.DEPARTURE;
        } else if (status == Status.DEPARTURE) {
            status = Status.FINAL_DELIVERY;
        } else if (status == Status.FINAL_DELIVERY) {
            status = Status.NONE_TRACKING;
        }
    }

 

변경 후 코드(1) 

    private Status status;

    private enum Status {

        ACCEPT(0),          //결제완료
        INSTRUCT(1),        //상품준비중
        DEPARTURE(2),       //배송지시
        FINAL_DELIVERY(3),  //배송중
        NONE_TRACKING(4);   //배송완료

        private static final String status[]={
            "결제완료", 
            "상품준비중",      
            "배송지시",
            "배송중", 
            "배송완료"
        };
        
        private int index=0;

        Status(int index) {
            this.index = index;
        }

        private void statusNext() {
            if(status.length -1 > index) {
                index++;
                return;
            }
            throw new EnumConstantNotPresentException(Status.class,"이미 완료된 배송입니다.");
        }

        private String getValue() {
            return status[index];
        }

    }

    public delivery() {
        status = Status.ACCEPT;
    }

    public void next(){
        status = status.statusNext();
    }

    public String getStatus(){
        return status.getValue();
    }

 

 

 

변경 후 코드(2) 

    private Status status;

    private enum Status {

        ACCEPT("결제완료"),         
        INSTRUCT("상품준비중"),      
        DEPARTURE("배송지시"),       
        FINAL_DELIVERY("배송중"),  
        NONE_TRACKING("배송완료");  

        private int index=0;
        private String val;

        Status(String val) {
            this.val = val;
        }

        private Status statusNext() {
            switch (this) {
                case ACCEPT:
                    return INSTRUCT;
                case INSTRUCT:
                    return DEPARTURE;
                case DEPARTURE:
                    return FINAL_DELIVERY;
                case FINAL_DELIVERY:
                    return NONE_TRACKING;
                default:
                    throw new EnumConstantNotPresentException(Status.class,"이미 완료된 배송입니다.");
            }
        }

        private String getValue() {
            return val;
        }

    }

    public delivery() { status = Status.ACCEPT;}

    public void next(){ status = status.statusNext(); }

    public String getStatus(){ return status.getValue();}

 

변경 1은 private static final 문자열로 저장하는 하고

            index 비교하면서 상태를 바꿔주고

 

변경 2는 스위치를 사용해서 상태를 바꿔준다. 

 

둘다 내가짠 코드라 

 둘다 차이가 거의 없다고 생각하지만 

 

다른 사람이 보면 또 몰라서

조만간 피드백을 받아야겠다.