Bütünlüğü uğruna...
Bunu Say gerçekten yapmak tedavi etmek istiyorum Mapgibi değerleri Lists, ancak kopyalama önlemek istiyorsanız Setbir içine Listher zaman.
Örneğin, belki bir oluşturur tek kütüphane işlevini aradığınız Set, ancak geçiyoruz Map<String, List<String>>sadece alır (kötü tasarlanmış ancak senin elinde) kütüphane işlevi sonucu Map<String, List<String>>olsa nasılsa biliyor işlemler onunla yaptığı Lists, herhangi biri Collection(ve dolayısıyla herhangi biri Set) için eşit olarak uygulanabilir . Ve bazı nedenlerden dolayı , her bir Seti bir Listeye kopyalamanın hız / bellek yükünden kaçınmanız gerekir.
Bu süper niş durumda, kütüphane fonksiyonunun sizin ihtiyaç duyduğunuz (belki de bilinemez) davranışa bağlı olarak, her Set üzerinde Listbir List görünüm oluşturabilirsiniz . Bunun doğal olarak güvensiz olduğuna dikkat edin (çünkü kütüphane fonksiyonunun her birinden gelen gereksinimler Listmuhtemelen bilmeden değişebilir), bu nedenle başka bir çözüm tercih edilmelidir. Ama işte böyle yapardın.
ListArabirimi uygulayan, yapıcıyı alan Setve bu Kümeyi bir alana atayan ve daha sonra bu iç öğeyi API'yi (mümkün ve istenen ölçüde) Setuygulamak için kullanırsınız List.
Bazı Liste davranışlarının öğeleri a olarak kaydetmeden taklit edemeyeceğinizi Listve bazı davranışları sadece kısmen taklit edebileceğinizi unutmayın. Yine, bu sınıf Listgenel olarak s için güvenli bir yedek yerine geçmez . Özellikle, kullanım durumunun dizinle ilgili işlemler veya MUTATING gerektirdiğini biliyorsanız List, bu yaklaşım güneye çok hızlı gider.
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);
...