완전성을 위해 ...
당신이 말 정말 수행 취급 할 Map
로 값을 List
S,하지만 당신은 복사를 방지 할 Set
로 List
할 때마다.
예를 들어, 어쩌면 당신은 생성 한 라이브러리 함수를 호출 Set
,하지만 당신은 전달하는 Map<String, List<String>>
것으로 만 소요 (제대로 설계하지만 손 만점) 라이브러리 함수에 결과를 Map<String, List<String>>
하더라도, 어떻게 든 당신이 알고 작업가 함께한다는 것을 List
s는 모든 Collection
(그리고 따라서 Set
)에 동일하게 적용됩니다 . 그리고 어떤 이유로 각 세트를 목록으로 복사하는 속도 / 메모리 오버 헤드를 피해야합니다.
이 수퍼 틈새의 경우 라이브러리 함수가 필요로하는 (알 수없는) 동작에 따라 각 세트에 List
대한 List
보기 를 작성할 수 있습니다 . 라이브러리 함수의 요구 사항은 List
사용자 모르게 변경 될 수 있기 때문에 이것은 본질적으로 안전하지 않으므로 다른 솔루션을 선호해야합니다. 그러나 여기 당신이 어떻게 할 것입니다.
List
인터페이스 를 구현하고 Set
생성자를 입력하고 해당 Set을 필드에 할당 한 다음 해당 내부 Set
를 사용 하여 List
API 를 구현할 수있는 클래스를 만듭니다 (가능한 경우).
일부 List 동작은 요소를으로 저장하지 않고는 모방 할 수 없으며 List
일부 동작은 부분적으로 만 모방 할 수 있습니다. 다시 말하지만이 클래스는 List
일반적으로 안전한 드롭 인 대체품이 아닙니다 . 특히 유스 케이스에 색인 관련 조작 또는 MUTATING이 필요하다는 것을 알고 있으면 List
이 접근 방식은 매우 빠르게 진행됩니다.
public class ListViewOfSet<U> implements List<U> {
private final Set<U> wrappedSet;
public ListViewOfSet(Set<U> setToWrap) { this.wrappedSet = setToWrap; }
@Override public int size() { return this.wrappedSet.size(); }
@Override public boolean isEmpty() { return this.wrappedSet.isEmpty(); }
@Override public boolean contains(Object o) { return this.wrappedSet.contains(o); }
@Override public java.util.Iterator<U> iterator() { return this.wrappedSet.iterator(); }
@Override public Object[] toArray() { return this.wrappedSet.toArray(); }
@Override public <T> T[] toArray(T[] ts) { return this.wrappedSet.toArray(ts); }
@Override public boolean add(U e) { return this.wrappedSet.add(e); }
@Override public boolean remove(Object o) { return this.wrappedSet.remove(o); }
@Override public boolean containsAll(Collection<?> clctn) { return this.wrappedSet.containsAll(clctn); }
@Override public boolean addAll(Collection<? extends U> clctn) { return this.wrappedSet.addAll(clctn); }
@Override public boolean addAll(int i, Collection<? extends U> clctn) { throw new UnsupportedOperationException(); }
@Override public boolean removeAll(Collection<?> clctn) { return this.wrappedSet.removeAll(clctn); }
@Override public boolean retainAll(Collection<?> clctn) { return this.wrappedSet.retainAll(clctn); }
@Override public void clear() { this.wrappedSet.clear(); }
@Override public U get(int i) { throw new UnsupportedOperationException(); }
@Override public U set(int i, U e) { throw new UnsupportedOperationException(); }
@Override public void add(int i, U e) { throw new UnsupportedOperationException(); }
@Override public U remove(int i) { throw new UnsupportedOperationException(); }
@Override public int indexOf(Object o) { throw new UnsupportedOperationException(); }
@Override public int lastIndexOf(Object o) { throw new UnsupportedOperationException(); }
@Override public ListIterator<U> listIterator() { throw new UnsupportedOperationException(); }
@Override public ListIterator<U> listIterator(int i) { throw new UnsupportedOperationException(); }
@Override public List<U> subList(int i, int i1) { throw new UnsupportedOperationException(); }
}
...
Set<String> set = getSet(...);
ListViewOfSet<String> listOfNames = new ListViewOfSet<>(set);
...