2016-09-15 2 views
-1

아래 예제에서 Enum은 클래스가 수행 할 처리량을 나타냅니다.처리 로직을 사용하여 enum 구현을하는 것이 좋습니까?

enum TriggerHandlerType { 
    DASHBOARD { 
     @Override 
     TriggerHandler create() { 
      return new DashboardTriggerHandler(); 
     } 
    }, 
    COMPONENT_HANDLER { 
     //... 
    }; 

    abstract TriggerHandler create(); 
} 

private static TriggerContext getTriggerContext(TriggerHandlerType triggerHandlerType) throws TriggerHandlerException { 
    return new TriggerContext(triggerHandlerType.create()); 
} 

열거 형은 일반적으로 상수의 유형을 안전하게 저장하는 데 사용되며이 경우 처리 논리에 따라 다양한 값을 반환합니다. 여기에서 열거 형은 클래스의 처리를 용이하게하는 상태 결정 자체를 수행하므로 포괄적 인 기술 인 것처럼 보입니다. 또한 반환 값은 유한 값의 하위 집합이므로 Enum 자체에서 처리를 처리하는 것이 좋습니다. 이 SOLID개폐 원칙을 파괴하고 클래스가 사람이에 대한 의견을 공유 할 수, 더 열거 형이 추가됩니다 때마다 코드 라인의 증가가 어디에

여기 문제를 볼 수 있습니까?

+1

상황에 따라 다릅니다.이 경우에는 끔찍한 생각입니다. –

+0

@ DavidPrezCabrera 의견을 보내 주셔서 감사합니다. Github에서이 코드를보고 다른 구체적인 클래스 나 스위치 케이스 또는 해시 맵을 사용하는 것보다 구현이 쉽다고 생각했습니다. 왜 그런 끔찍한 생각이 드나요? 어떤 특별한 이유가있다 –

+0

@RealSkeptic 나는 동의한다! 나는 그것을 github에서 가져 갔다. 나는 그것을 제거하고 하나 만들었다. 지금은 이해가 되길 바란다. –

답변

0

sintax 설탕을하기 때문에 이미 정렬 CRITERIAS 정의의 상수는 ..

모두 유효합니다.

Java 8 및 단 하나의 재정의 메소드를 사용하면 함수 인터페이스를 매개 변수로 사용하여 생성자를 만들 수도 있습니다.

enum TriggerHandlerType { 
    DASHBOARD(() -> DashboardTriggerHandler::new)), 
    COMPONENT_HANDLER (() -> { ... }); 

    private final Fun fun; 

    private TriggerHandlerType(Fun fun) { 
     this.fun = fun; 
    } 

    public TriggerHandler create() { 
     fun.apply(); 
    } 
} 

다른 경우에는 클래스 분리를 ​​위해이 기술을 사용하지 않았으며 명확한 계층의 클래스가 있습니다. enum은 아직 후기 클래스를 사용하지 않는 초기 클래스입니다.

지도에서 열거 형 처리기으로 매핑하는 것이 좋습니다. 단위 테스트는 생성 된 맵의 크기가 enum 값과 동일한 지 확인합니다. '

저는 enum이 인공 커플 링이라고 말할 필요가 없습니다. 고정 요소 수 또는 아니요, 별도의 클래스/싱글 톤 수 있습니다.

0

진짜 대답 :에 대해 정의 된 열거가 무엇인지 따라 달라집니다 ..

당신이 지속적으로 구문 설탕 같은 API 클라이언트에 의해 구현 일부 기능을 열거를 정의 할 수 있습니다

...

의 좋은 예 즉, 각 상수는 시간을 계산하기 위해 사용될 수있는 최종적인 클래스 인

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html#toHours(long)

다른 열거 비교기 인터페이스를 구현하는 용구 변환 자바 TimerUnit 인 나는 같은 일을 또는 같은 운영, AND, 서열과 같은 열거했다