Java Collections Framework বিভিন্ন ধরনের কন্টেইনার বা ডেটা স্ট্রাকচার সরবরাহ করে, যেমন List, Set, Map ইত্যাদি। কখনও কখনও, আমরা এমন একটি Collection তৈরি করতে চাই যা অপরিবর্তনীয় (immutable) বা থ্রেড-সেফ (synchronized) হয়। এই ধরনের কন্টেইনার ব্যবহার করার সময় আমাদের কিছু নির্দিষ্ট নিয়ম অনুসরণ করতে হয়।
এই লেখায় আমরা দেখব কিভাবে Immutable Collections এবং Synchronized Collections তৈরি করা যায়।
1. Immutable Collections
Immutable Collections এমন একটি ডেটা স্ট্রাকচার যেখানে একবার উপাদান যোগ করা হলে সেটি পরিবর্তনযোগ্য থাকে না। এটি খুবই উপকারী যখন আপনি চান যে কোনো ডেটা কন্টেইনার একবার তৈরি হওয়ার পর তা মডিফাই না করা হয়, অর্থাৎ কোন add, remove, বা update অপারেশন হতে পারে না।
Java-তে Immutable Collections তৈরি করার জন্য আমরা Collections.unmodifiable মেথড ব্যবহার করতে পারি অথবা List.of(), Set.of(), Map.of() এর মতো Immutable collection factory মেথড ব্যবহার করতে পারি (যথাযথভাবে Java 9 বা তার পরবর্তী সংস্করণে)।
1.1. Collections.unmodifiable()
Collections.unmodifiableList(), Collections.unmodifiableSet(), এবং Collections.unmodifiableMap() মেথডগুলো দিয়ে আপনি একটি অপরিবর্তনীয় (immutable) কন্টেইনার তৈরি করতে পারেন।
Example: Immutable List using Collections.unmodifiableList()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ImmutableListExample {
public static void main(String[] args) {
// Creating a modifiable list
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Creating an immutable list
List<String> immutableList = Collections.unmodifiableList(list);
System.out.println("Immutable List: " + immutableList);
// Trying to modify the immutable list will throw an exception
try {
immutableList.add("Mango"); // This will throw UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Error: Cannot modify an immutable list");
}
}
}
Output:
Immutable List: [Apple, Banana, Orange]
Error: Cannot modify an immutable list
ব্যাখ্যা:
Collections.unmodifiableList(list)একটি অপরিবর্তনীয় List তৈরি করেছে। যখন আপনি এই immutable list এর সাথে কোনো পরিবর্তন করার চেষ্টা করেন, এটিUnsupportedOperationExceptionছুড়ে দেয়।
1.2. Immutable Set and Map using Factory Methods (Java 9 and later)
Java 9 থেকে Set.of(), List.of(), এবং Map.of() মেথডগুলো সরাসরি Immutable Set, List, এবং Map তৈরি করতে ব্যবহৃত হতে পারে।
import java.util.Set;
public class ImmutableSetExample {
public static void main(String[] args) {
Set<String> fruits = Set.of("Apple", "Banana", "Orange");
System.out.println("Immutable Set: " + fruits);
// Trying to modify the immutable set will throw an exception
try {
fruits.add("Mango"); // This will throw UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Error: Cannot modify an immutable set");
}
}
}
Output:
Immutable Set: [Apple, Banana, Orange]
Error: Cannot modify an immutable set
ব্যাখ্যা:
Set.of()একটি Immutable Set তৈরি করেছে। কোনো নতুন উপাদান যোগ করতে পারবে না।
2. Synchronized Collections
Synchronized Collections এমন Collection যা একাধিক থ্রেড থেকে নিরাপদে অ্যাক্সেস করা যায়। সাধারণত, Java Collections থ্রেড-সেফ নয়, কিন্তু আপনি synchronized প্যাকেজের মাধ্যমে থ্রেড-সেফ কন্টেইনার তৈরি করতে পারেন, যেখানে একাধিক থ্রেড একই ডেটা স্ট্রাকচার অ্যাক্সেস করতে পারে।
Collections.synchronizedList(), Collections.synchronizedSet(), এবং Collections.synchronizedMap() মেথডগুলো দিয়ে আপনি থ্রেড-সেফ কন্টেইনার তৈরি করতে পারেন।
Example: Synchronized List
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SynchronizedListExample {
public static void main(String[] args) {
// Creating a modifiable list
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Making the list synchronized
List<String> synchronizedList = Collections.synchronizedList(list);
// Displaying synchronized list
System.out.println("Synchronized List: " + synchronizedList);
// Synchronizing manually when iterating
synchronized (synchronizedList) {
for (String fruit : synchronizedList) {
System.out.println(fruit);
}
}
}
}
Output:
Synchronized List: [Apple, Banana, Orange]
Apple
Banana
Orange
ব্যাখ্যা:
Collections.synchronizedList(list)এর মাধ্যমে একটি থ্রেড-সেফ List তৈরি করা হয়েছে। যখন আপনি iterator ব্যবহার করে এটি পুনঃপ্রবাহিত করবেন, তখন আপনাকে ম্যানুয়ালি এটি সিঙ্ক্রোনাইজ করতে হবে, যেহেতুIteratorএর জন্যsynchronizedকোড ব্লক প্রয়োজন।
Example: Synchronized Set
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class SynchronizedSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Orange");
// Making the set synchronized
Set<String> synchronizedSet = Collections.synchronizedSet(set);
// Displaying synchronized set
System.out.println("Synchronized Set: " + synchronizedSet);
// Synchronizing manually when iterating
synchronized (synchronizedSet) {
for (String fruit : synchronizedSet) {
System.out.println(fruit);
}
}
}
}
Output:
Synchronized Set: [Apple, Banana, Orange]
Apple
Banana
Orange
3. Differences Between Immutable and Synchronized Collections
| Feature | Immutable Collection | Synchronized Collection |
|---|---|---|
| Mutability | Elements cannot be modified (add, remove, or update). | Elements can be modified, but thread-safety is ensured. |
| Thread Safety | Not inherently thread-safe. | Thread-safe; synchronized access to the collection. |
| Performance | Slightly more efficient for read-only operations. | May have performance overhead due to synchronization. |
| Usage | Used when you need constant data, no changes allowed. | Used when you need to ensure safe access in multi-threaded environments. |
- Immutable Collections তৈরি করার জন্য আপনি
Collections.unmodifiable*()মেথড ব্যবহার করতে পারেন অথবা Java 9 থেকেList.of(),Set.of(),Map.of()ব্যবহার করে। - Synchronized Collections তৈরি করার জন্য আপনি
Collections.synchronized*()মেথড ব্যবহার করতে পারেন, যা থ্রেড-সেফ অপারেশন নিশ্চিত করে। - Immutable Collections সাধারণত যখন ডেটা পরিবর্তন সম্ভব নয়, তখন ব্যবহার করা হয়, আর Synchronized Collections থ্রেড-সেফ ডেটা স্ট্রাকচার ব্যবহারের জন্য উপযোগী।
এই দুটি ধরনের কন্টেইনারই আপনাকে বিশেষ পরিস্থিতিতে সাহায্য করে, যেমন যখন আপনি নিশ্চিত করতে চান যে ডেটার কোনো পরিবর্তন না হয় বা আপনি একাধিক থ্রেডের মধ্যে নিরাপদে ডেটা অ্যাক্সেস করতে চান।
Read more