অতীতে, আমি সংগ্রহটি নিরাপদে কিছু অনুলিপি করতে বলেছিলাম যেমন কিছু করুন:
public static void doThing(List<String> strs) {
List<String> newStrs = new ArrayList<>(strs);
অথবা
public static void doThing(NavigableSet<String> strs) {
NavigableSet<String> newStrs = new TreeSet<>(strs);
তবে এই "অনুলিপি" নির্মাতারা, অনুরূপ স্থিতিশীল তৈরির পদ্ধতি এবং স্ট্রিমগুলি কি সত্যই নিরাপদ এবং নিয়মগুলি কোথায় নির্দিষ্ট করা হয়েছে? নিরাপদে আমার অর্থ জাভা ভাষায় প্রদত্ত বেসিক সিমেটিক অখণ্ডতা গ্যারান্টি হ'ল এবং কোনও ক্ষতিকারক কলারের বিরুদ্ধে প্রয়োগ করা হয়েছে, যুক্তিসঙ্গতভাবে ব্যাক আপ গ্রহণ করে SecurityManager
এবং কোনও ত্রুটি নেই।
আমি পদ্ধতি নিক্ষেপ সঙ্গে খুশি ConcurrentModificationException
, NullPointerException
, IllegalArgumentException
, ClassCastException
ইত্যাদি অথবা সম্ভবত এমনকি ঝুলন্ত।
আমি String
অপরিবর্তনীয় ধরণের যুক্তির উদাহরণ হিসাবে বেছে নিয়েছি । এই প্রশ্নের জন্য, আমি পরিবর্তনশীল ধরণের সংগ্রহের গভীর কপিগুলিতে আগ্রহী নই যার নিজস্ব গটছ রয়েছে।
(স্পষ্টরূপে, আমি ওপেনজেডিকে উত্স কোডটি দেখেছি এবং এর জন্য ArrayList
এবং এর একরকম উত্তর পেয়েছি TreeSet
))
NavigableSet
এবং অন্যান্য Comparable
ভিত্তিক সংগ্রহগুলি কখনও কখনও সনাক্ত করতে পারে যে কোনও শ্রেণি compareTo()
সঠিকভাবে প্রয়োগ করে না এবং একটি ব্যতিক্রম ছুঁড়ে দেয়। অবিশ্বস্ত যুক্তি দ্বারা আপনি কী বোঝাতে চাইছেন এটি কিছুটা অস্পষ্ট। আপনি বলতে চাইছেন যে একজন দুষ্টু লোক খারাপ স্ট্রিংয়ের একটি সংগ্রহশালা তৈরি করে এবং আপনি যখন সেগুলি আপনার সংগ্রহে অনুলিপি করেন তখন কোনও খারাপ ঘটনা ঘটে? না, সংগ্রহের কাঠামোটি বেশ শক্ত, এটি প্রায় 1.2 এর কাছাকাছি।
HashSet
(এবং সাধারণভাবে অন্যান্য সকল হ্যাশ সংগ্রহ) শুদ্ধি / অখণ্ডতা উপর নির্ভর hashCode
উপাদানের প্রয়োগ, TreeSet
এবং PriorityQueue
উপর নির্ভর করে Comparator
(এবং আপনি এমনকি করতে পারেন না কাস্টম তুলনাকারী না থাকলে একটি সমতুল্য অনুলিপি তৈরি করুন), EnumSet
নির্দিষ্ট enum
ধরণের অখণ্ডতার উপর ভরসা করে যা সংকলনের পরে কখনই যাচাই করা হয় না, সুতরাং কোনও শ্রেণি ফাইল, উত্পন্ন javac
বা হস্তশিল্প দ্বারা উত্পাদিত নয় , এটি বিকৃত করতে পারে।
new TreeSet<>(strs)
যেখানে strs
একটি হল NavigableSet
। এটি একটি বাল্ক অনুলিপি নয়, ফলস্বরূপ TreeSet
উত্সের তুলকটি ব্যবহার করা হবে, যা শব্দার্থবিজ্ঞান ধরে রাখতে এমনকি প্রয়োজনীয়। যদি আপনি কেবল অন্তর্ভুক্ত উপাদানগুলিকে প্রক্রিয়াকরণ দিয়ে ঠিক থাকেন toArray()
তবে যাবার উপায়; এমনকি এটি পুনরাবৃত্তির ক্রমটি রাখবে। আপনি যখন "উপাদান নিন, উপাদানটি কার্যকর করুন, উপাদানটি ব্যবহার করুন" দিয়ে ভাল থাকেন, আপনার এমনকি অনুলিপি তৈরি করার দরকার নেই। আপনি যখন সমস্ত উপাদান ব্যবহার করে সমস্ত উপাদান যাচাই করতে চান তখন সমস্যা শুরু হয় all তারপরে, আপনি কোনও TreeSet
অনুলিপি কাস্টম তুলককে বিশ্বাস করতে পারবেন না
checkcast
প্রতিটি উপাদান জন্য একটি এর প্রভাব আছে , toArray
একটি নির্দিষ্ট ধরনের সঙ্গে হয়। আমরা সবসময় এটি শেষ করছি। জেনেরিক সংগ্রহগুলি এমনকি তাদের আসল উপাদানটির প্রকারটি জানে না, তাই তাদের অনুলিপি নির্মাণকারীরা অনুরূপ কার্যকারিতা সরবরাহ করতে পারে না। অবশ্যই, আপনি পূর্বের ব্যবহারের জন্য কোনও পরীক্ষা স্থগিত করতে পারেন, তবে তারপরে, আপনার প্রশ্নগুলি কী লক্ষ্য করছে তা আমি জানি না। উপাদানগুলির ব্যবহার করার আগে অবিলম্বে চেক করা এবং ব্যর্থ হওয়াতে আপনি যখন ভাল থাকেন তখন আপনার "সিমেটিক অখণ্ডতা" লাগবে না।