Java Collections: আপনি যে লুকানো টুলগুলো মিস করছেন
বেশিরভাগ ডেভেলপার প্রতিদিন একইভাবে Java collections ব্যবহার করেন। তারা ArrayLists এবং HashSets ব্যবহার করেন। কিন্তু আপনি হয়তো এমন কিছু টুল মিস করছেন যা আপনার কোডকে আরও দ্রুত এবং নিরাপদ করতে পারে।
আপনার কোড উন্নত করার জন্য এখানে তিনটি নির্দিষ্ট টুল দেওয়া হলো।
- Arrays.asList একটি প্রকৃত List নয়
যখন আপনি Arrays.asList(array) ব্যবহার করেন, তখন আপনি একটি নির্দিষ্ট আকারের (fixed-size) লিস্ট পান। এটি সরাসরি আপনার মূল array-এর সাথে যুক্ত থাকে।
- যদি আপনি array পরিবর্তন করেন, তবে লিস্টটিও পরিবর্তিত হয়ে যাবে।
- যদি আপনি আইটেম যোগ বা রিমুভ করার চেষ্টা করেন, তবে আপনার কোড একটি এরর (error) দিয়ে ক্র্যাশ করবে।
এটি ঠিক করতে, এটিকে একটি নতুন ArrayList-এ র্যাপ (wrap) করুন:
List<String> list = new ArrayList<>(Arrays.asList(array));
এটি একটি প্রকৃত এবং স্বতন্ত্র লিস্ট তৈরি করে যা আপনি পরিবর্তন করতে পারবেন।
- পারফরম্যান্সের জন্য EnumSet ব্যবহার করুন
আপনি কি enums গুলো HashSet-এ সংরক্ষণ করেন? এটি অপ্রয়োজনীয় ওভারহেড (overhead) তৈরি করে। HashSet হাশ টেবিল এবং অবজেক্ট হেডার ব্যবহার করে।
এর পরিবর্তে EnumSet ব্যবহার করুন। এটি অভ্যন্তরীণভাবে একটি bit vector ব্যবহার করে। এটি অত্যন্ত দ্রুত এবং প্রায় কোনো মেমরি খরচ করে না। এটি প্লেয়ার পাওয়ার বা সেটিংসের মতো ফ্ল্যাগ-ভিত্তিক সিস্টেমের জন্য উপযুক্ত।
- এটি type-safe।
- এটি HashSet-এর চেয়ে অনেক বেশি দ্রুত।
- এটি আপনার হয়ে bitwise অপারেশনগুলো পরিচালনা করে।
- ক্যাশের (cache) জন্য ConcurrentHashMap.computeIfAbsent ব্যবহার করুন
আপনি যদি একটি ক্যাশ তৈরি করেন, তবে একাধিক থ্রেড যাতে একই ভ্যালু ক্যালকুলেট না করে সেজন্য আপনাকে প্রায়ই জটিল কোড লিখতে হয়। একে double-checked locking বলা হয়। এটি পড়া কঠিন এবং এতে ভুল হওয়ার সম্ভাবনা বেশি।
এর পরিবর্তে, মাত্র এক লাইন ব্যবহার করুন:
cache.computeIfAbsent(key, this::expensiveCalculation);
এই মেথডটি অ্যাটমিক (atomic)। এটি নিশ্চিত করে যে ক্যালকুলেশনটি মাত্র একবারই চলবে, এমনকি যদি অনেকগুলো থ্রেড একই সময়ে একই কী (key)-এর জন্য অনুরোধ করে তবুও। এটি বাগ (bug) কমায় এবং আপনার উদ্দেশ্য পরিষ্কার করে।
কেন এই টুলগুলো গুরুত্বপূর্ণ:
- অনুমেয় পারফরম্যান্স: আপনি লুকানো মেমরি খরচ এড়াতে পারেন।
- কম বাগ: আপনি মাল্টি-থ্রেডেড কোডে race condition নিয়ে লড়াই করা বন্ধ করতে পারেন।
- আরও পরিষ্কার কোড: অন্যান্য ডেভেলপাররা আপনার ডিজাইন তাৎক্ষণিকভাবে বুঝতে পারবেন।
ফ্রেমওয়ার্কের সাথে লড়াই করা বন্ধ করুন। আরও স্লিম এবং নিরাপদ কোড লেখার জন্য এটি ব্যবহার করা শুরু করুন।