Immutable Tuples হলো এমন ডেটা স্ট্রাকচার, যা তৈরি হওয়ার পরে পরিবর্তন করা যায় না। Immutable Tuples ব্যবহারে Thread-Safety নিশ্চিত করা যায়, কারণ একাধিক থ্রেড থেকে একসাথে ডেটা অ্যাক্সেস করলেও ডেটা পরিবর্তন করার কোনো ঝুঁকি থাকে না।
Immutable Tuples এর বৈশিষ্ট্য
- Immutable (অপরিবর্তনীয়): একবার তৈরি হলে Tuple-এ থাকা ডেটা পরিবর্তন করা যায় না।
- Thread-Safe: Immutable হওয়ার কারণে একাধিক থ্রেড একসাথে নিরাপদে ডেটা অ্যাক্সেস করতে পারে।
- Lightweight: Immutable Tuples সাধারণত কমপ্যাক্ট এবং দ্রুত কার্যকর।
Thread-Safe Immutable Tuples তৈরি করার উপায়
১. Vavr লাইব্রেরি ব্যবহার করে Immutable Tuples
Dependency (Maven):
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.10.4</version>
</dependency>
কোড উদাহরণ:
import io.vavr.Tuple;
import io.vavr.Tuple3;
public class ImmutableTupleExample {
public static void main(String[] args) {
// Immutable Tuple তৈরি
Tuple3<String, Integer, Boolean> user = Tuple.of("Alice", 25, true);
// ডেটা অ্যাক্সেস
System.out.println("Name: " + user._1); // Alice
System.out.println("Age: " + user._2); // 25
System.out.println("Active: " + user._3); // true
// Tuple পরিবর্তন করার চেষ্টা (সম্ভব নয়)
// user._1 = "Bob"; // Compilation error
}
}
২. Apache Commons Lang লাইব্রেরি ব্যবহার করে Immutable Tuples
Dependency (Maven):
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
কোড উদাহরণ:
import org.apache.commons.lang3.tuple.Pair;
public class ImmutablePairExample {
public static void main(String[] args) {
// Immutable Pair তৈরি
Pair<String, Integer> employee = Pair.of("Bob", 30);
// ডেটা অ্যাক্সেস
System.out.println("Name: " + employee.getLeft()); // Bob
System.out.println("Age: " + employee.getRight()); // 30
// Pair পরিবর্তন করার চেষ্টা (সম্ভব নয়)
// employee.setLeft("Alice"); // UnsupportedOperationException
}
}
৩. Custom Immutable Tuple ক্লাস তৈরি
কোড উদাহরণ:
class ImmutableTuple<T1, T2, T3> {
private final T1 first;
private final T2 second;
private final T3 third;
public ImmutableTuple(T1 first, T2 second, T3 third) {
this.first = first;
this.second = second;
this.third = third;
}
public T1 getFirst() {
return first;
}
public T2 getSecond() {
return second;
}
public T3 getThird() {
return third;
}
}
public class CustomImmutableTupleExample {
public static void main(String[] args) {
// Custom Immutable Tuple তৈরি
ImmutableTuple<String, Double, Boolean> product = new ImmutableTuple<>("Laptop", 999.99, true);
// ডেটা অ্যাক্সেস
System.out.println("Product: " + product.getFirst());
System.out.println("Price: $" + product.getSecond());
System.out.println("In Stock: " + product.getThird());
}
}
Thread-Safe Data Structure এর উদাহরণ
১. Shared Data Management with Tuples
একাধিক থ্রেড থেকে Immutable Tuples ব্যবহার করে ডেটা নিরাপদে শেয়ার করা।
কোড উদাহরণ:
import io.vavr.Tuple;
import io.vavr.Tuple3;
public class ThreadSafeTupleExample {
public static void main(String[] args) {
// Shared Immutable Tuple
Tuple3<String, Integer, Boolean> sharedData = Tuple.of("SharedResource", 42, true);
// থ্রেড ১
Thread thread1 = new Thread(() -> {
System.out.println("Thread 1 - Name: " + sharedData._1);
});
// থ্রেড ২
Thread thread2 = new Thread(() -> {
System.out.println("Thread 2 - Value: " + sharedData._2);
});
// থ্রেড ৩
Thread thread3 = new Thread(() -> {
System.out.println("Thread 3 - Active: " + sharedData._3);
});
thread1.start();
thread2.start();
thread3.start();
}
}
আউটপুট:
Thread 1 - Name: SharedResource
Thread 2 - Value: 42
Thread 3 - Active: true
২. Thread-Safe Data Caching
Immutable Tuples ব্যবহার করে নিরাপদ ক্যাশ তৈরি করা।
কোড উদাহরণ:
import io.vavr.Tuple;
import io.vavr.Tuple2;
import java.util.concurrent.ConcurrentHashMap;
public class ThreadSafeCache {
private final ConcurrentHashMap<String, Tuple2<String, Double>> cache = new ConcurrentHashMap<>();
public void put(String key, String name, Double price) {
cache.put(key, Tuple.of(name, price));
}
public Tuple2<String, Double> get(String key) {
return cache.get(key);
}
public static void main(String[] args) {
ThreadSafeCache cache = new ThreadSafeCache();
cache.put("P1", "Laptop", 999.99);
Thread thread = new Thread(() -> {
Tuple2<String, Double> product = cache.get("P1");
System.out.println("Product: " + product._1 + ", Price: $" + product._2);
});
thread.start();
}
}
আউটপুট:
Product: Laptop, Price: $999.99
Immutable Tuples এর সুবিধা
- Thread-Safety: Immutable হওয়ার কারণে ডেটা পরিবর্তনের কোনো ঝুঁকি নেই।
- Lightweight: ডেটা স্টোরেজ এবং প্রসেসিংয়ের জন্য হালকা সমাধান।
- Reusability: একাধিক জায়গায় Tuples পুনরায় ব্যবহার করা যায়।
- Reduced Complexity: Shared ডেটার জন্য Synchronization দরকার হয় না।
Immutable Tuples এর সীমাবদ্ধতা
- নামবিহীন ডেটা অ্যাক্সেস:
_1,_2ইত্যাদি ব্যবহার করে ডেটা অ্যাক্সেস করতে হয়। - Complexity in Deep Structures: Nested Tuples ব্যবহারে ডেটা অ্যাক্সেস জটিল হতে পারে।
- Standard Library Support: জাভার নিজস্ব Immutable Tuple সাপোর্ট নেই; তৃতীয় পক্ষের লাইব্রেরি প্রয়োজন।
Immutable Tuples ব্যবহার করে Thread-Safe Data Structure তৈরি করা সহজ এবং কার্যকর। এটি ছোট ডেটা সেট এবং Shared Resource Management-এর জন্য উপযোগী। Vavr এবং Apache Commons Lang লাইব্রেরি ব্যবহার করে Tuples তৈরি করা যেতে পারে, অথবা প্রয়োজন অনুযায়ী কাস্টম Immutable Tuples ইমপ্লিমেন্ট করা যায়।
Immutable Tuples ব্যবহার করে ডেটা প্রসেসিং নিরাপদ এবং কার্যকর করতে আপনার নির্দিষ্ট প্রয়োজন অনুযায়ী উপযুক্ত পদ্ধতি নির্বাচন করুন।
Read more