2009-10-21 4 views
3

어떻게 추상 열거 형이나 기본 열거 형을 사용할 수 있습니까?어떻게 자바 열거 형을 감싸고 여전히 반복 할 수 있습니까?

내 일반적인 코드에서 구체적인 열거 형에 묶이지 않고 열거 형 자리 표시 자 MyItems의 개념을 원합니다. 그런 다음 각 프로젝트에서 구체적인 구현 방법을 사용하게됩니다.

예. 공통 코드

public interface MyItems { 
    // Marker interface 
} 

프로젝트

public enum Items implements MyItems { 
    RED_CAR, BLUE_CAR, GREEN_CAR; 
} 

프로젝트 B

이 작동하는 것 같다,하지만 내 공통 코드에 내 인터페이스 열거를 통해 루프를 쓸 수 없습니다
public enum Items implements MyItems { 
    BROWN_TREE, GREEN_TREE; 
} 

, 열거 형이 아니기 때문에. 내 공통 코드에서 내가

for (MyItems item : MyItems.values()) 
    doSomething(item); 

을 쓰고 싶지만 내 인터페이스 그냥 마커 인터페이스 할 수 없기 때문에, 그리고 그것이 .values이없는().

모든 의견을 매우 높이 평가합니다. 내가 완전히 잘못된 방식으로 노력하고 있는지 나는 모른다.

답변

8

values() 메서드가 정적 인이기 때문에 실제로이 작업을 수행하는 것은 의미가 없습니다. 전화를 걸려면 전화를 걸려는 유형을 알아야합니다. , 예를

public interface MyItemsFactory<T extends MyItems> 
{ 
    Iterable<T> values(); 
} 

을 다음 몇 가지 일반적인 방법으로 그것을 구현 :

당신이 올 수있는 가장 가까운해야하는 것

public class EnumFactory<T extends Enum<T> & MyItems> 
    implements MyItemsFactory<T> 
{ 
    private final Class<T> clazz; 

    public EnumFactory(Class<T> clazz) 
    { 
     this.clazz = clazz; 
    } 

    public Iterable<T> values() 
    { 
     return EnumSet.allOf(clazz); 
    } 
} 

그러나 기본 규칙은 다형성과 정적 방법이 섞이지 않는다는 것입니다. 전화에서 :

for(MyItems item : MyItems.values()) 
    doSomething(item); 
MyItems의 구현은 당신이 반복 기대

? MyItems을 구현하는 유형의로드가있을 수 있습니다.

+0

답장을 보내 주셔서 감사 드리며 충분히 이해하려고 노력하겠습니다. 귀하의 질문에 대답하기 위해, 나는 내가 아주 분명하다고 생각하지 않습니다. 내 이상은 내가 사용하고자하는 열거 형을 '삽입'할 수 있으며, 공통 코드를 사용하는 각 프로젝트에서 바뀔 것이다. 나는 열거 형을 반복하고 물건을 할 수있는 공통 코드를 원한다. – Pengin

+0

그것을 반복 할 수 있어야하고 다형 적으로 그렇게하고 싶다면, 당신이 주입 할 필요가있는 것은 공장에서의 대답입니다. 그러면 값을 적절하게 반복 할 수 있습니다. –

1

열거 형을 Type Safe Enum Pattern으로 바꾸면 특정 구현에 대한 모든 값을 반환하는 values ​​() 메서드를 사용하여 인터페이스를 구현할 수 있습니다.

관련 문제