문제

Java 5 이상에는 구현하는 모든 항목에서 마술처럼 작동하는 foreach 루프가 있습니다. Iterable:

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

하지만, Enumerable 아직 구현하지 않음 Iterable, 즉 Enumeration 다음을 수행해야 합니다.

for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}

혹시 이유가 있는지 아시는 분 계신가요? Enumeration 아직 구현하지 않음 Iterable?

편집하다: 명확히 하자면, 나는 언어 개념에 대해 말하는 것이 아닙니다. 열거형, 저는 '라는 Java API의 Java 관련 클래스에 대해 이야기하고 있습니다.열거'.

도움이 되었습니까?

해결책

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

Iterable을 지원하도록 Enumeration이 변경되면 많은 사람들의 코드가 손상될 수 있습니다.

다른 팁

쉽고 깨끗한 향상된 for 루프와 함께 열거를 사용하는 방법은 java.util.Collections.list를 사용하여 ArrayList로 변환합니다.

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

(javax.swing.table.TableColumnModel.getColumns는 열거형을 반환합니다.)

이는 매우 약간 덜 효율적일 수 있습니다.

그것은 의미가 없습니다 Enumeration 구현 Iterable. Iterable 에 대한 팩토리 메소드입니다. Iterator. Enumeration 와 유사하다 Iterator, 단일 열거형에 대해서만 상태를 유지합니다.

그러니 포장을 하려고 할 때 조심하세요. Enumeration 로서 Iterable.누군가가 나를 지나쳐 가면 Iterable, 전화할 수 있다고 가정하겠습니다 iterator() 반복해서 여러 개를 생성합니다. Iterator 원하는 대로 인스턴스를 만들고 각각 독립적으로 반복합니다.포장된 Enumeration 이 계약을 이행하지 않을 것입니다.포장하지 마세요 Enumeration 자신의 코드에서 탈출하세요.(여담으로 나는 Java 7이 DirectoryStream 이런 식으로 기대치를 위반하므로 "탈출"도 허용되어서는 안 됩니다.)

Enumeration 은 다음과 같다 Iterator, 아니 Iterable.ㅏ Collection ~이다 Iterable.안 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();
}

없다 Enumerable 에 해당 Iterable.for 루프에서 작업하기 위해 아무것도 중단하지 않고 추가할 수 있지만 요점은 무엇입니까?이 새로운 기능을 구현할 수 있다면 Enumerable 인터페이스, 왜 구현하지 않는가? Iterable 대신에?

AFAIK 열거는 일종의 "더 이상 사용되지 않음":

반복자는 Java Collections 프레임 워크에서 열거를 대신합니다.

Enumeration 대신 Iterator를 사용하도록 JSR 315로 Servlet API를 변경하기를 바랍니다.

구문적으로 좀 더 깔끔하게 만들고 싶다면 다음을 사용할 수 있습니다.

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top