Immutable Collections হল এমন Collections (যেমন List, Set, Map) যার উপাদানগুলি একবার সেট হলে তাদের মান পরিবর্তন করা সম্ভব নয়। ইমিউটেবল (Immutable) কন্টেইনারগুলি ফাংশনাল প্রোগ্রামিংয়ে অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ডেটার অপরিবর্তনীয়তা নিশ্চিত করে, যা thread safety এবং side-effect free প্রোগ্রামিং প্যাটার্নের জন্য সহায়ক।
Java 9 তে Immutable Collections এর জন্য নতুন ফিচার আসার পর, এটি আরও সহজ এবং কার্যকরভাবে ব্যবহার করা সম্ভব হয়েছে।
এই গাইডে, Java Collections এর Immutable Configuration সম্পর্কিত ধারণা, এবং সেগুলি কিভাবে কনফিগার করা যায় তা আলোচনা করা হবে।
১. Immutable Collection কি?
একটি Immutable Collection এমন একটি Collection (যেমন List, Set, Map) যার ভ্যালুগুলি একবার তৈরি হওয়ার পর আর পরিবর্তন করা যায় না। এটি immutable হওয়ার কারণে ডেটার অখণ্ডতা (integrity) বজায় রাখে এবং কোডের সাইড-এফেক্ট (side-effects) কমিয়ে আনে।
Java তে Immutable Collections তৈরি করার কয়েকটি পদ্ধতি রয়েছে।
২. Java 9+ এ Immutable Collections
Java 9 এ নতুন কিছু static factory methods যোগ করা হয়েছে যা দিয়ে আপনি খুব সহজেই Immutable Collections তৈরি করতে পারেন।
২.১ Immutable List
Java 9 থেকে, আপনি List এর জন্য List.of() মেথড ব্যবহার করে ইমিউটেবল লিস্ট তৈরি করতে পারবেন।
import java.util.List;
public class ImmutableListExample {
public static void main(String[] args) {
List<String> immutableList = List.of("apple", "banana", "cherry");
// This will throw UnsupportedOperationException
// immutableList.add("date"); // Uncommenting this will cause an exception
// Print the immutable list
System.out.println(immutableList); // Output: [apple, banana, cherry]
}
}
এখানে, List.of() ব্যবহার করে একটি Immutable List তৈরি করা হয়েছে। এই লিস্টে নতুন উপাদান যোগ করা যাবে না, এটি UnsupportedOperationException থ্রো করবে।
২.২ Immutable Set
Set এর জন্যও একইভাবে Set.of() ব্যবহার করা যায়।
import java.util.Set;
public class ImmutableSetExample {
public static void main(String[] args) {
Set<String> immutableSet = Set.of("apple", "banana", "cherry");
// This will throw UnsupportedOperationException
// immutableSet.add("date"); // Uncommenting this will cause an exception
// Print the immutable set
System.out.println(immutableSet); // Output: [apple, banana, cherry]
}
}
এখানে, Set.of() ব্যবহার করে একটি Immutable Set তৈরি করা হয়েছে, এবং এতে নতুন উপাদান যোগ করা সম্ভব নয়।
২.৩ Immutable Map
Map এর জন্য Map.of() ব্যবহার করা যেতে পারে, যা একটি ইমিউটেবল ম্যাপ তৈরি করে।
import java.util.Map;
public class ImmutableMapExample {
public static void main(String[] args) {
Map<String, Integer> immutableMap = Map.of("apple", 1, "banana", 2, "cherry", 3);
// This will throw UnsupportedOperationException
// immutableMap.put("date", 4); // Uncommenting this will cause an exception
// Print the immutable map
System.out.println(immutableMap); // Output: {apple=1, banana=2, cherry=3}
}
}
এখানে, Map.of() ব্যবহার করে একটি Immutable Map তৈরি করা হয়েছে। নতুন কী বা মান যোগ করা যাবে না।
৩. Java 8-এ Immutable Collections
Java 8 তে Collections.unmodifiableList(), Collections.unmodifiableSet(), Collections.unmodifiableMap() ইত্যাদি মেথড ব্যবহার করে ইমিউটেবল কালেকশন তৈরি করা সম্ভব।
৩.১ Immutable List (Java 8)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ImmutableListJava8Example {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
// Making the list immutable
List<String> immutableList = Collections.unmodifiableList(list);
// This will throw UnsupportedOperationException
// immutableList.add("date"); // Uncommenting this will cause an exception
// Print the immutable list
System.out.println(immutableList); // Output: [apple, banana, cherry]
}
}
এখানে, Collections.unmodifiableList() ব্যবহার করে একটি Immutable List তৈরি করা হয়েছে। এর মানে, লিস্টে কোন পরিবর্তন সম্ভব নয়।
৩.২ Immutable Set (Java 8)
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class ImmutableSetJava8Example {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
// Making the set immutable
Set<String> immutableSet = Collections.unmodifiableSet(set);
// This will throw UnsupportedOperationException
// immutableSet.add("date"); // Uncommenting this will cause an exception
// Print the immutable set
System.out.println(immutableSet); // Output: [apple, banana, cherry]
}
}
এখানে, Collections.unmodifiableSet() ব্যবহার করে একটি Immutable Set তৈরি করা হয়েছে।
৩.৩ Immutable Map (Java 8)
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class ImmutableMapJava8Example {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
// Making the map immutable
Map<String, Integer> immutableMap = Collections.unmodifiableMap(map);
// This will throw UnsupportedOperationException
// immutableMap.put("date", 4); // Uncommenting this will cause an exception
// Print the immutable map
System.out.println(immutableMap); // Output: {apple=1, banana=2, cherry=3}
}
}
এখানে, Collections.unmodifiableMap() ব্যবহার করে একটি Immutable Map তৈরি করা হয়েছে।
৪. Immutable Collections এর প্রয়োজনীয়তা
- Thread Safety: ইমিউটেবল কালেকশন ব্যবহারে thread safety নিশ্চিত করা হয়। কারণ যখন একটি কালেকশন ইমিউটেবল হয়, তখন তার উপাদান পরিবর্তন করা সম্ভব নয়, ফলে একাধিক থ্রেড একই সময়ে নিরাপদে কাজ করতে পারে।
- Data Integrity: ইমিউটেবল ডেটা অপরিবর্তনীয় হওয়ায় ডেটার অখণ্ডতা বজায় থাকে। এটি side-effect free প্রোগ্রামিং প্যাটার্ন তৈরি করে, যেখানে কোনও আউটপুট পরিবর্তিত হওয়ার আশঙ্কা থাকে না।
- Read-Only Data: যখন আপনি এমন ডেটা চান যা কোনো পরিস্থিতিতে পরিবর্তিত হবে না, তখন ইমিউটেবল কালেকশন ব্যবহার করা শ্রেয়। উদাহরণস্বরূপ, কনফিগারেশন সেটিংস বা স্থির মানের কালেকশন।
- Functional Programming: Functional programming এ সাধারণত ইমিউটেবল ডেটার সাথে কাজ করা হয়, কারণ এতে ডেটার পরিবর্তন এড়িয়ে কোডের নির্ভরযোগ্যতা এবং predictability বাড়ে।
- Avoiding Bugs: ইমিউটেবল ডেটা পরিবর্তনযোগ্য নয়, তাই এতে ডেটার অপ্রত্যাশিত পরিবর্তন বা ভুল পরিচালনা থেকে রক্ষা পাওয়া যায়।
Immutable Collections Java তে একটি অত্যন্ত কার্যকরী ধারণা, যা ডেটার নিরাপত্তা, অখণ্ডতা এবং সিস্টেমের স্থিতিশীলতা নিশ্চিত করে। Java 9 এবং Java 8 তে ইমিউটেবল কালেকশন তৈরির সুবিধা যুক্ত করা হয়েছে, যা কোডের কার্যকারিতা বৃদ্ধি করে এবং ডেটার উপর কাজ করার সময় সমস্যা দূর করে। ইমিউটেবল কালেকশনগুলো thread safety, data integrity, এবং functional programming এ বিশেষভাবে কার্যকর।
Read more