열거 형이 반복되지 않는 이유는 무엇입니까?
Java 5 이상에서는 다음을 구현하는 모든 항목에서 마술처럼 작동하는 foreach 루프가 있습니다 Iterable
.
for (Object o : list) {
doStuff(o);
}
그러나 Enumerable
여전히는 구현하지 않습니다 Iterable
. 즉,을 반복 Enumeration
하려면 다음을 수행해야합니다.
for(; e.hasMoreElements() ;) {
doStuff(e.nextElement());
}
Enumeration
아직 구현하지 않는 이유가 있는지 아는 사람이 Iterable
있습니까?
편집 : 명확하게 말하면 enum 의 언어 개념에 대해 말하는 것이 아니라 ' Enumeration ' 이라는 Java API의 Java 특정 클래스에 대해 이야기하고 있습니다.
열거 형은 구체적인 클래스가 아니기 때문에 Iterable을 지원하도록 수정되지 않았습니다 (컬렉션 인터페이스를 지원하도록 수정 된 Vector처럼).
Enumeration이 Iterable을 지원하도록 변경되면 많은 사람들의 코드가 손상됩니다.
향상된 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
하여 AS를 Iterable
. 누군가 나에게을 전달 하면 반복적으로 Iterable
호출 iterator()
하여 Iterator
원하는만큼 인스턴스를 만들고 각각에 대해 독립적으로 반복 할 수 있다고 가정합니다 . 포장 Enumeration
은이 계약을 이행하지 않습니다. 래핑 된 Enumeration
코드가 자신의 코드에서 벗어나지 않도록하십시오 . (제쳐두고, 나는 자바 7 DirectoryStream
이 이러한 방식으로 기대치를 위반하고 "탈출"하는 것도 허용해서는 안된다는 것을 알았다 .)
Enumeration
이 Iterator
아닌 Iterable
. A Collection
는 Iterable
입니다. An 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 열거 형은 "사용되지 않음"입니다 .
Iterator는 Java 컬렉션 프레임 워크에서 Enumeration을 대신합니다.
Enumeration 대신 Iterator를 사용하도록 JSR 315로 Servlet API를 변경하기를 바랍니다.
구문 적으로 좀 더 깔끔하게하려면 다음을 사용할 수 있습니다.
while(e.hasMoreElements()) {
doStuff(e.nextElement());
}
참고 URL : https://stackoverflow.com/questions/27240/why-arent-enumerations-iterable
'Program Tip' 카테고리의 다른 글
ExecutionPolicy 동작이 Visual Studio의 프로젝트마다 다른 이유는 무엇입니까? (0) | 2020.11.16 |
---|---|
'if'문의 끝에 세미콜론 (0) | 2020.11.16 |
C ++에서 typedef를 언제 사용해야합니까? (0) | 2020.11.16 |
ERRORLEVEL을 0으로 재설정하는 가장 쉬운 방법은 무엇입니까? (0) | 2020.11.16 |
PowerShell의 명령 출력에 줄 바꿈을 추가하려면 어떻게해야합니까? (0) | 2020.11.16 |