เพื่อความสมบูรณ์ ...
บอกว่าคุณจริงๆไม่ต้องการที่จะรักษาMap
ค่าเป็นList
s แต่คุณต้องการที่จะหลีกเลี่ยงการคัดลอกSet
ลงในList
แต่ละครั้ง
ยกตัวอย่างเช่นบางทีคุณอาจจะเรียกฟังก์ชันหนึ่งที่สร้างSet
แต่คุณจะผ่านของคุณMap<String, List<String>>
ผลไป (ไม่ดีการออกแบบ แต่ออกมาจากมือของคุณ) ฟังก์ชั่นห้องสมุดที่ใช้เวลาเพียงMap<String, List<String>>
แม้อย่างใดที่คุณจะรู้ว่าการดำเนินการมันไม่ด้วยList
s เท่าเทียมกันบังคับใด ๆCollection
(เช่นใด ๆSet
) และด้วยเหตุผลบางอย่างคุณจำเป็นต้องหลีกเลี่ยงค่าใช้จ่ายความเร็ว / หน่วยความจำในการคัดลอกแต่ละชุดเป็นรายการ
ในกรณีพิเศษนี้ขึ้นอยู่กับพฤติกรรม (อาจไม่รู้) ฟังก์ชั่นห้องสมุดต้องการออกจากคุณList
คุณอาจจะสามารถสร้างList
มุมมองในแต่ละชุด โปรดทราบว่านี่ไม่ปลอดภัยโดยเนื้อแท้ (เนื่องจากความต้องการของฟังก์ชั่นห้องสมุดจากแต่ละคนList
อาจเปลี่ยนแปลงได้โดยที่คุณไม่ทราบ) ดังนั้นจึงควรเลือกใช้โซลูชันอื่น แต่นี่คือวิธีที่คุณทำ
คุณจะสร้างคลาสที่ใช้List
อินเทอร์เฟซรับSet
ตัวสร้างและกำหนดให้กับเขตข้อมูลจากนั้นใช้ภายในนั้นSet
เพื่อใช้List
API (เท่าที่เป็นไปได้และต้องการ)
โปรดทราบว่าพฤติกรรมบางอย่างของรายการคุณจะไม่สามารถเลียนแบบได้โดยไม่ต้องเก็บองค์ประกอบไว้เป็น a List
และพฤติกรรมบางอย่างที่คุณจะเลียนแบบได้เพียงบางส่วนเท่านั้น อีกครั้งคลาสนี้ไม่ใช่การแทนที่ดร็อปดาวน์อย่างปลอดภัยสำหรับList
s โดยทั่วไป โดยเฉพาะอย่างยิ่งถ้าคุณรู้ว่ากรณีการใช้งานต้องการการดำเนินการที่เกี่ยวข้องกับดัชนีหรือการตัดทอน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);
...