𝗝𝗮𝘃𝗮 𝗖𝗼𝗹𝗹𝗲𝗰𝘁𝗶𝗼𝗻𝘀: 𝗧𝗵𝗲 𝗛𝗶𝗱𝗱𝗲𝗻 𝗧𝗼𝗼𝗹𝘀 𝗬𝗼𝘂 𝗠𝗶𝘀𝘀

زیادہ تر ڈویلپرز روزانہ Java collections کو ایک ہی طریقے سے استعمال کرتے ہیں۔ وہ ArrayLists اور HashSets کا استعمال کرتے ہیں۔ لیکن ہو سکتا ہے کہ آپ ان ٹولز سے محروم ہوں جو آپ کے کوڈ کو تیزتر اور محفوظ بنا سکتے ہیں۔

اپنے کوڈ کو بہتر بنانے کے لیے یہاں تین مخصوص ٹولز دیے گئے ہیں۔

  1. Arrays.asList ایک حقیقی List نہیں ہے

جب آپ Arrays.asList(array) استعمال کرتے ہیں، تو آپ کو ایک مقررہ سائز (fixed-size) کی لسٹ ملتی ہے۔ یہ براہ راست آپ کے اصل array سے منسلک ہوتی ہے۔

  • اگر آپ array کو تبدیل کرتے ہیں، تو list بھی تبدیل ہو جاتی ہے۔
  • اگر آپ آئٹمز شامل کرنے یا ہٹانے کی کوشش کرتے ہیں، تو آپ کا کوڈ ایرر (error) کے ساتھ کریش ہو جائے گا۔

اسے ٹھیک کرنے کے لیے، اسے ایک نئی ArrayList میں لپیٹ (wrap) دیں: List<String> list = new ArrayList<>(Arrays.asList(array));

یہ ایک حقیقی اور آزاد لسٹ بناتا ہے جسے آپ تبدیل کر سکتے ہیں۔

  1. کارکردگی (performance) کے لیے EnumSet کا استعمال کریں

کیا آپ enums کو HashSet میں اسٹور کرتے ہیں؟ یہ غیر ضروری اوور ہیڈ (overhead) پیدا کرتا ہے۔ HashSets ہیش ٹیبلز (hash tables) اور آبجیکٹ ہیڈرز (object headers) کا استعمال کرتے ہیں۔

اس کے بجائے EnumSet استعمال کریں۔ یہ اندرونی طور پر ایک bit vector استعمال کرتا ہے۔ یہ انتہائی تیز ہے اور تقریباً کوئی میموری استعمال نہیں کرتا۔ یہ فلیگ پر مبنی سسٹمز (flag-based systems) جیسے کہ پلیئر پاورز یا سیٹنگز کے لیے بہترین ہے۔

  • یہ type-safe ہے۔
  • یہ HashSet سے کہیں زیادہ تیز ہے۔
  • یہ آپ کے لیے bitwise operations کو سنبھالتا ہے۔
  1. کیشز (caches) کے لیے ConcurrentHashMap.computeIfAbsent کا استعمال کریں

اگر آپ کوئی کیش (cache) بناتے ہیں، تو آپ اکثر پیچیدہ کوڈ لکھتے ہیں تاکہ متعدد تھریڈز (threads) کو ایک ہی ویلیو دوبارہ کیلکولیٹ کرنے سے روکا جا سکے۔ اسے double-checked locking کہا جاتا ہے۔ یہ پڑھنے میں مشکل اور خراب ہونے میں آسان ہے۔

اس کے بجائے، صرف ایک لائن استعمال کریں: cache.computeIfAbsent(key, this::expensiveCalculation);

یہ میتھڈ atomic ہے۔ یہ اس بات کو یقینی بناتا ہے کہ کیلکولیشن صرف ایک بار چلے، چاہے بہت سے تھریڈز ایک ہی وقت میں ایک ہی کی (key) کے لیے درخواست کریں۔ یہ بگ (bugs) کو کم کرتا ہے اور آپ کے مقصد کو واضح کرتا ہے۔

یہ ٹولز کیوں اہم ہیں:

  • قابلِ پیش گوئی کارکردگی (Predictable performance): آپ چھپے ہوئے میموری اخراجات سے بچ جاتے ہیں۔
  • کم بگ (Fewer bugs): آپ ملٹی تھریڈڈ کوڈ میں race conditions سے لڑنا بند کر دیتے ہیں۔
  • واضح کوڈ: دوسرے ڈویلپرز آپ کے ڈیزائن کو فوری طور پر سمجھ جاتے ہیں۔

فریم ورک سے لڑنا بند کریں۔ اسے کم اور محفوظ کوڈ لکھنے کے لیے استعمال کرنا شروع کریں۔

Source: https://dev.to/timevolt/java-collections-the-hidden-relics-most-developers-miss-and-why-theyre-game-changers-4ehd