UFO ET IT

Java 열거에서 foreach를 사용할 수없는 이유는 무엇입니까?

ufoet 2020. 11. 14. 11:24
반응형

Java 열거에서 foreach를 사용할 수없는 이유는 무엇입니까?


내가 할 수없는 이유 :

Enumeration e = ...
for (Object o : e)
  ...

Enumeration<T>확장하지 않기 때문에 Iterable<T>. 다음은 Iterable Enumerations를 만드는 예제입니다 .

왜 그것이 흥미로운 질문인지에 관해서. 이것은 정확히 당신의 질문은 아니지만 그것에 대해 약간의 빛을 비 춥니 다. 로부터 자바 컬렉션 API 디자인 자주 묻는 질문 :

Iterator가 Enumeration을 확장하지 않는 이유는 무엇입니까?

우리는 Enumeration의 메서드 이름을 불행하게 생각합니다. 매우 길고 자주 사용됩니다. 우리가 방법을 추가하고 완전히 새로운 프레임 워크를 만들고 있다는 점을 감안할 때 이름을 개선 할 기회를 이용하지 않는 것은 어리석은 일이라고 생각했습니다. 물론 우리는 Iterator에서 새 이름과 이전 이름을 지원할 수 있지만 가치가 없어 보입니다.

그것은 기본적으로 Sun이 매우 장황한 구문을 가진 매우 초기 Java 인 Enumeration과 거리를두기를 원한다는 것을 나에게 시사합니다.


Collections 유틸리티 클래스를 사용하면 Enumeration을 다음과 같이 반복 할 수 있습니다.

Enumeration headerValues=request.getHeaders("mycustomheader");
List headerValuesList=Collections.list(headerValues);

for(Object headerValueObj:headerValuesList){
 ... do whatever you want to do with headerValueObj
}

나는이 문제를 두 개의 매우 간단한 클래스, Enumeration하나는 Iterator. 열거 형 래퍼는 다음과 같습니다.

static class IterableEnumeration<T>
extends Object
implements Iterable<T>, Iterator<T>
{
private final Enumeration<T>        enumeration;
private boolean                     used=false;

IterableEnumeration(final Enumeration<T> enm) {
    enumeration=enm;
    }

public Iterator<T> iterator() {
    if(used) { throw new IllegalStateException("Cannot use iterator from asIterable wrapper more than once"); }
    used=true;
    return this;
    }

public boolean hasNext() { return enumeration.hasMoreElements(); }
public T       next()    { return enumeration.nextElement();     }
public void    remove()  { throw new UnsupportedOperationException("Cannot remove elements from AsIterator wrapper around Enumeration"); }
}

정적 유틸리티 방법 (내 기본 설정)과 함께 사용할 수 있습니다.

/**
 * Convert an `Enumeration<T>` to an `Iterable<T>` for a once-off use in an enhanced for loop.
 */
static public <T> Iterable<T> asIterable(final Enumeration<T> enm) {
    return new IterableEnumeration<T>(enm);
    }

...

for(String val: Util.asIterable(enm)) {
    ...
    }

또는 클래스를 인스턴스화하여 :

for(String val: new IterableEnumeration<String>(enm)) {
    ...
    }

새로운 스타일 for 루프 ( "foreach")는 배열과 Iterable인터페이스 를 구현하는 것들에서 작동합니다 .

또한 to Iterator보다 유사 Iterable하므로 Enumerationforeach를 사용하지 않는 한 작업하는 것이 합리적이지 않습니다 Iterator(그렇지 않습니다). Enumeration에 찬성하는 것도 권장하지 않습니다 Iterator.


Enumeration doesn't implement Iterable and as such can't be used directly in a foreach loop. However using Apache Commons Collections it's possible to iterate over an enumeration with:

for (Object o : new IteratorIterable(new EnumerationIterator(e))) {
    ...
}

You could also use a shorter syntax with Collections.list() but this is less efficient (two iterations over the elements and more memory usage) :

for (Object o : Collections.list(e))) {
    ...
}

With java 8 and beyond this is possible:

import java.util.Collections;
import java.util.Enumeration;

Enumeration e = ...;
Collections.list(e).forEach(o -> {
    ... // use item "o"
});

Because an Enumeration (and most classes derived from this interface) does not implement Iterable.

You can try to write your own wrapper class.

참고URL : https://stackoverflow.com/questions/1240077/why-cant-i-use-foreach-on-java-enumeration

반응형