2009-09-15 6 views
7

내가 틀릴 수도 있지만 Why can't enums be declared locally in a method? 에서 추측하겠습니다. Java의 열거 형을 로컬에서 선언 할 수 없으므로 메서드에서 열거 형을 반환하는 것이 문제가됩니까? 메소드가 Enum (아래 참조)을 반환해야한다고 선언 할 수 있지만 null 이외의 다른 메소드를 반환하거나 메소드 외부에서 선언 된 Enum에 대한 참조를 구현하는 방법은 무엇입니까? 내 첫 번째 성향은 Generics를 사용하여이를 조사하는 것이지만 SO 커뮤니티가 피할 수있게 도와 준다면 모든 데드 엔드를 피하고 싶습니다.자바 메소드가 유형 열거 형을 반환 할 수 있습니까?

private Enum resources() { 
    return null; 
} 
+0

'Enum'유형 또는 'Enum'값을 반환 하시겠습니까? – jjnguy

+0

질문의 제목이 가장 적절한 것인지 잘 모르겠습니다. 당신은 실제로 무엇을하고 싶습니까? –

+0

혼란에 빠져서 죄송합니다. 나는 확신하기 위해 노력하고 있습니다. (내 생각이 늦은 오후에 엉망이되기 시작합니다.)하지만 저는 일반적인 Enum *이 아닌 * 멤버를 리턴하는 메소드를 원합니다. Enum에서. –

답변

8

나는 정확하다고 생각하는데, null 또는 Enum을 다른 곳에서 선언 할 수만 있습니다. 그러나 컴파일 타임에 "다른 것"을 지정할 필요는 없습니다. 이것은 인위적인 예입니다 분명히

class EnumEnumeratorDemo { 
    enum Foo { 
     BAR, BAZ, QUX; 
     @Override public String toString() { 
      return name().toLowerCase(); 
     } 
    } 

    public static void main(String[] args) { 
     for (Foo f : new EnumEnumerator<Foo>(Foo.class)) { 
      System.out.println(f); 
     } 
    } 
} 

(실제 삶에서 당신은해야한다 :

class EnumEnumerator<T extends Enum<T>> implements Iterable<T> { 
    private final Class<T> enumClass; 

    public EnumEnumerator(Class<T> enumClass) { 
     this.enumClass = enumClass; 
    } 

    public Iterator<T> iterator() { 
     T[] values = enumClass.getEnumConstants(); 
     return Arrays.asList(values).iterator(); 
    } 
    } 

나중에, 당신은 당신이 관심있는 일반 생성자를 전문으로 열거 클래스를 전달하여 호출 Foo.values ​​()를 호출하면 아이디어를 얻을 수 있습니다.

+0

이 수업을 사용하는 방법을 추가 할 수 있습니까? – msysmilu

+0

완료 - 도움이 되길 바랍니다. –

+1

p.s. 당신이 할 수있는 값의 배열을 얻기 위해서'values ​​= enumClass.getEnumConstants()' – newacct

2

수행하려는 작업은 무엇입니까? 나는 이것이 당신이가는 것이 아니다 추측하고있어,

public class Test 
{ 
    public static void main(String args[]) 
    { 
     System.out.println(doit()); 
    } 

    public enum Foo { 
     BAR, 
     BAZ; 
    } 
    public static Enum doit() { 
     return Enum.valueOf(Foo.class,"BAR"); 
    } 
} 

그러나이는 Enum을 반환하는 방법이 있나요?

+1

당신은'Enum '을 원합니다. –

+0

사실,이 코드는 필요하지 않습니다. 이상한 일이 전혀 보이지 않는 것 같습니다. – davetron5000

1

네, 물론 가능합니다. 귀하의 질문에 대한 열거 형을 선언 경우

private Enum getRetentionPolicy() { 
    return java.lang.annotation.RetentionPolicy.SOURCE; 
} 

, 당신이 그들을 선언 할 수있다 :

  • 을 최상위 class 유사 자신의 자바 파일에;
  • 다른 클래스에 속하는 Java 파일 내에서 정적 내부와 비슷 함 class;
1

완전히 확실하지 무엇을 당신의 목표는, 그러나 당신이 총칭 방법 (오버라이드 (override) 할 것, 즉 하나)을 반환하고 싶다면 다음과 같이 할 수도 있습니다 :

public class MyEnumClass<T extends Enum<T>> { 
    public T resources() { 
     //do stuff here 
    } 
} 

완전히 확실하지 무엇 Enum과 그 요소의 다른 세트에 대해 이야기하는 것이 유익 할지라도, 거기에서 얻을 것입니다.

내가 알고있는 한 Enum 클래스 (예 : 반복자에 대한 역행렬)에 대해 이야기하는 경우 제네릭이 여기에서 많이 도움이 될지 잘 모르겠습니다.

1

열거 형의 값은 해당 이름으로 참조 할 수 있습니다 (예 : Suit.SPADES.

values ​​() 메서드를 사용하여 모든 값을 반복하고 값 중 하나를 선택할 수 있습니다.

3

모든 enum은 Enum 인터페이스를 구현하므로이 방법으로 열거 형을 반환하는 메서드를 작성할 수 있습니다. 다만,이 메소드는 단일의 enum 치를 돌려줍니다. 전체 enum을 포함하는 일반 값을 반환하는 방법은 없습니다 (클래스를 반환하고 반사를 제외하고). 그러나 당신이 생각하는 것보다 다소 적은 모든 열거 형 값을 반환 할 수 있습니다. 더 형태 보증 된 공통 인터페이스를 구현 관심 의 열거 형을 가지고입니다

enum Resources { ONE, TWO, THREE } 
enum MoreResources { UN, DEUX, TROIS } 
private Enum<?>[] resources() { 
    List<Enum<?>> resources = new ArrayList<Enum<?>>(); 
    resources.addAll(Arrays.asList(Resources.values()); 
    resources.addAll(Arrays.asList(MoreResources.values()); 
    return resources.toList(new Enum<?>[] {}); 
} 

더 좋은 방법 :이 방법의

enum Resources { ONE, TWO, THREE } 
private Enum<?>[] resources() { 
    return Resources.values(); 
} 

이점 중 하나는 예를 들어, 더 많거나 적은 값을 반환 할 수있다 예

더 많은 기능을 제공하기 위해 인터페이스에 메소드를 추가 할 수 있습니다.

3

자바가 열거하는 방식의 전체적인 점은 형식이 안전하다는 것입니다. 그래서 당신이 정의한 실제 유형 (예 : "소송")을 반환하는 대신 Enum을 반환하지 않을 것입니다.) 클래스처럼 작동합니다. 양복에는 "열거 형"인스턴스가 4 개 있습니다.

"Suit"를 원한다면 "Rank"가 7이 되려면 얼마나 좋을까요? 그것은 모든 것을 망칠 것입니다!

또한 "열거 형"또는 일부 일반 값을 전달한 경우 메서드를 호출 할 수 없습니다. TypeSafe Enums에서 가장 멋진 점은 "Suit"를 가져 와서 "Suit.getColor()"를 호출하고 해당 색상의 색상을 얻을 것으로 완전히 기대할 수 있다는 것입니다. 또는, 더 중요한 것은

assertTrue(SPADES.ranksHigherThan(HEARTS)); 

을 : 당신은 또한 성취 수있는 ranksHigherThan (양복들)을 가질 수

suit1.ranksHigherThan(suit2); 

(그들은 모두에 전달 된 당신은 그들이 무엇인지 모르는 가정)

유형 안정성은 정말 놀랍습니다 (처음에는 다소 불편 함을 느끼지만).

관련 문제