Bütünlüğü uğruna...
Bunu Say gerçekten yapmak tedavi etmek istiyorum Map
gibi değerleri List
s, ancak kopyalama önlemek istiyorsanız Set
bir içine List
her 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ığı List
s, 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 List
bir 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 List
muhtemelen bilmeden değişebilir), bu nedenle başka bir çözüm tercih edilmelidir. Ama işte böyle yapardın.
List
Arabirimi uygulayan, yapıcıyı alan Set
ve bu Kümeyi bir alana atayan ve daha sonra bu iç öğeyi API'yi (mümkün ve istenen ölçüde) Set
uygulamak için kullanırsınız List
.
Bazı Liste davranışlarının öğeleri a olarak kaydetmeden taklit edemeyeceğinizi List
ve bazı davranışları sadece kısmen taklit edebileceğinizi unutmayın. Yine, bu sınıf List
genel 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);
...