শেষ করার জন্য...
আপনি বলে দিন সত্যিই কি আচরণ করতে চান Map
যেমন মান List
গুলি, কিন্তু আপনি অনুলিপি এড়াতে চান Set
একটি মধ্যে List
প্রতিটি সময়।
উদাহরণ হিসেবে বলা যায়, আপনি হয়ত একটি সৃষ্টি এক লাইব্রেরি ফাংশন আহ্বান করা হয় Set
, কিন্তু আপনি আপনার ক্ষণস্থায়ী হয় Map<String, List<String>>
একটি (দুর্বল ডিজাইন কিন্তু আপনার হাত থেকে) গ্রন্থাগারের ফাংশন যা শুধুমাত্র লাগে ফলাফলের Map<String, List<String>>
যদিও একরকম আপনি কি জানেন যে অপারেশন এটা দিয়ে কাজ করে List
গুলি যে কোনও Collection
(এবং এইভাবে কোনও Set
) ক্ষেত্রে সমানভাবে প্রযোজ্য । এবং কোনও কারণে আপনাকে প্রতিটি সেটকে একটি তালিকায় অনুলিপি করার গতি / মেমরির ওভারহেড এড়াতে হবে।
এই সুপার কুলুঙ্গি ক্ষেত্রে, (সম্ভবত অজানা) আচরণের উপর ভিত্তি করে লাইব্রেরির ফাংশনটি আপনার প্রয়োজনের বাইরে হওয়া উচিত List
, আপনি প্রতিটি সেটের উপরে একটি List
ভিউ তৈরি করতে সক্ষম হতে পারেন । মনে রাখবেন যে এটি অন্তর্নিহিতভাবে অনিরাপদ (কারণ প্রত্যেকের কাছ থেকে গ্রন্থাগারের ফাংশনগুলির প্রয়োজনীয়তাগুলি List
সম্ভবত আপনাকে না জেনেই পরিবর্তন করতে পারে), সুতরাং অন্য একটি সমাধান পছন্দ করা উচিত। তবে আপনি এটি কীভাবে করবেন তা এখানে।
আপনি এমন একটি শ্রেণি তৈরি করতে চান যা List
ইন্টারফেস প্রয়োগ করে , Set
কনস্ট্রাক্টারে নিয়ে যায় এবং ক্ষেত্রের জন্য সেট করে দেয় এবং তারপরে এপিআই Set
প্রয়োগ করতে List
( অভ্যন্তরীণ পরিমাণ এবং পছন্দসই) প্রয়োগ করে ।
নোট করুন যে কিছু তালিকা আচরণ আপনি কেবল উপাদান হিসাবে সংরক্ষণ না করে অনুকরণ করতে পারবেন না List
এবং কিছু আচরণ আপনি কেবল আংশিকভাবে অনুকরণ করতে সক্ষম হবেন। আবার, এই শ্রেণিটি List
সাধারণভাবে এর জন্য নিরাপদ ড্রপ-ইন প্রতিস্থাপন নয় । বিশেষত, আপনি যদি জানেন যে ব্যবহারের ক্ষেত্রে সূচী-সম্পর্কিত ক্রিয়াকলাপ বা মিউট্যাটিং প্রয়োজন 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);
...