2008-08-26 7 views
57

당신은 Iterable를 구현 아무것도 마술 작동 foreach 루프,이 이상 :열거 형을 반복 할 수없는 이유는 무엇입니까? 자바 5에서

for (Object o : list) { 
    doStuff(o); 
} 

그러나, Enumerable 여전히 Enumeration 다음을 수행해야합니다을 반복하는 것을 의미 Iterable를 구현하지 않습니다 :

for(; e.hasMoreElements() ;) { 
    doStuff(e.nextElement()); 
} 
이유 Enumeration 여전히 Iterable를 구현하지 않는 이유가있는 경우

사람이 알고 있나요?

편집 : 해명으로, 나는 내가 'Enumeration'라는 자바 API에서 자바 특정 클래스를 이야기하고, enum의 언어 개념에 대해 이야기하고 있지 않다.

+0

가이 블록 내부 doStuff (e.nextElement())해야하지? –

답변

34

열거 형은 인터페이스가 구체적 클래스가 아니기 때문에 (예 : Collections 인터페이스를 지원하도록 수정 된 Vector와 같은) Iterable을 지원하도록 수정되지 않았습니다.

열거 형이 Iterable을 지원하도록 변경된 경우 많은 사람들의 코드가 손상됩니다.

+11

** ** Iterable ** 및 ** 배열 모두에 대해 for-each가 지원된다는 점을 감안할 때 왜 Sun에는 Enumerable도 포함되지 않았습니까? – akuhn

+8

@Adrian Kuhn : Iterator에 대해 for-each 지원을 포함하지 않았으며 Enumerable은 Iterable이 아닌 Iterator처럼 작동합니다. –

+4

열거 형은 IteraBLE이 아닙니다. Enumeratrion은 실제로 IteraTOR입니다 (그러나 '삭제'는 제외). http://stackoverflow.com/a/8197868/117220. 이 설명을 통해 대답은 기존 API를 손상시킬 수 있다는 것입니다. 스칼라 (Scala) 특성과 같이 인터페이스에서 부분적으로 구현이 허용되면 역 호환이 가능합니다. –

6

AFAIK 열거 kinda "deprecated"입니다 :

반복자는 자바 컬렉션 열거의 장소

나는 그들이 Iterator를 대신 사용하는 JSR 315를 서블릿 API를 변경 바랍니다 프레임 워크를한다 열거 형

44

EnumerationIterable을 구현하는 것은 의미가 없습니다. IterableIterator의 공장 메서드입니다. EnumerationIterator과 유사하며 단일 열거 형의 상태 만 유지합니다.

EnumerationIterable으로 두려면주의하십시오. 누군가 내가 Iterable을 전달하면, 내가 원하는만큼 많은 Iterator 인스턴스를 생성하고 각각에 대해 독립적으로 반복하여 iterator()을 반복적으로 호출 할 수 있다고 가정합니다. 포장 된 Enumeration은이 계약을 이행하지 않습니다. 랩핑 된 Enumeration을 자신의 코드에서 탈출시키지 마십시오. (여담으로, 나는 자바 7의 DirectoryStream 그냥 이런 식으로 기대를 위반하고 중 하나 "탈출"을 허용하지 않아야 것으로 나타났습니다.)

EnumerationIterator 아닌 Iterable 같다. CollectionIterable입니다. Iterator은 그렇지 않습니다.

이 작업을 수행 할 수 없습니다

Vector<X> list = … 
Iterator<X> i = list.iterator(); 
for (X x : i) { 
    x.doStuff(); 
} 

는 그래서 이렇게 이해가되지 것입니다 :

Vector<X> list = … 
Enumeration<X> i = list.enumeration(); 
for (X x : i) { 
    x.doStuff(); 
} 

Iterable에 해당 아무 Enumerable 없습니다. for 루프에서 아무 것도하지 않고도 추가 할 수 있지만 그 점은 무엇입니까? 이 새로운 Enumerable 인터페이스를 구현할 수 있다면 Iterable 대신 구현하십시오.

72

간편한 향상된 for 루프를 사용하여 열거 형을 사용하는 방법으로 java.util.Collections.list를 사용하여 ArrayList로 변환하십시오.

for (TableColumn col : Collections.list(columnModel.getColumns()) { 

주 (javax.swing.table.TableColumnModel.getColumns가 열거합니다. 반환)이 아주 약간 덜 효율적일 수있다. 당신은 그냥 구문 조금 청소기를 싶습니다 경우

+2

Funny : 이것 (컬럼 모델의 컬럼)은 정확한 이유입니다 나는이 질문을 발견했다. – Dave

+0

좋은 해결 방법. –

1

, 당신은 사용할 수 있습니다

while(e.hasMoreElements()) { 
    doStuff(e.nextElement()); 
} 
관련 문제