জাভা জেনেরিক্স (Java Generics) জাভার একটি শক্তিশালী ফিচার যা ক্লাস, ইন্টারফেস এবং মেথডকে টাইপ (type) নির্ধারণ করতে সাহায্য করে। এটি কোডকে আরও নিরাপদ এবং সহজপাঠ্য করে তোলে। Generics এর মাধ্যমে, আপনি compile-time টাইপ চেকিং নিশ্চিত করতে পারেন এবং runtime টাইপ কাস্টিং (type casting) থেকে মুক্তি পেতে পারেন।
Generics Syntax
Generics এর ক্ষেত্রে, < এবং > চিহ্ন ব্যবহার করে টাইপ প্যারামিটার নির্ধারণ করা হয়।
1. Generics ক্লাস
// Generic Class Example
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
// Usage:
Box<Integer> integerBox = new Box<>();
integerBox.set(10);
System.out.println(integerBox.get());
উপরের উদাহরণে, T হল একটি টাইপ প্যারামিটার যা compile-time এ নির্ধারিত হবে।
2. Generics মেথড
// Generic Method Example
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
// Usage:
Integer[] intArray = {1, 2, 3};
String[] stringArray = {"Hello", "World"};
printArray(intArray);
printArray(stringArray);
উপরের মেথডে <T> টাইপ প্যারামিটার হিসেবে কাজ করছে, যা মেথড কল করার সময় নির্ধারিত হয়।
3. Generics ইন্টারফেস
// Generic Interface Example
public interface Pair<K, V> {
K getKey();
V getValue();
}
// Implementation
public class OrderedPair<K, V> implements Pair<K, V> {
private K key;
private V value;
public OrderedPair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
// Usage:
Pair<String, Integer> pair = new OrderedPair<>("One", 1);
System.out.println(pair.getKey() + " = " + pair.getValue());
Type Parameters
Generics টাইপ প্যারামিটার হিসাবে ব্যবহার করা যায়। সাধারণ টাইপ প্যারামিটারগুলোর সংক্ষেপে নামকরণ করা হয়:
T→ TypeE→ Element (collection-এর জন্য)K→ KeyV→ ValueN→ Number
Bounded Type Parameters
Generics এ টাইপ প্যারামিটারকে সীমাবদ্ধ (bounded) করা যায়।
// Bounded Type Parameter Example
public <T extends Number> void addNumbers(T a, T b) {
System.out.println(a.doubleValue() + b.doubleValue());
}
// Usage:
addNumbers(5, 10); // Valid
addNumbers(5.5, 10.5); // Valid
// addNumbers("5", "10"); // Compile-time Error
Wildcard in Generics
Wildcard (?) ব্যবহার করে বিভিন্ন টাইপের ডেটা হ্যান্ডেল করা যায়।
// Wildcard Example
public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
// Usage:
List<Integer> intList = List.of(1, 2, 3);
List<String> stringList = List.of("A", "B", "C");
printList(intList);
printList(stringList);
Generics এর সুবিধা
- Compile-Time টাইপ চেকিং: এটি টাইপ মিসম্যাচ সংক্রান্ত runtime errors প্রতিরোধ করে।
- Type Casting-এর প্রয়োজন নেই: Generics ব্যবহার করলে টাইপ কাস্টিং করতে হয় না।
- কোড পুনঃব্যবহারযোগ্য করা যায়: একই কোড বিভিন্ন ডেটা টাইপের জন্য ব্যবহার করা যায়।
- Enhanced Readability: কোড আরও পরিষ্কার এবং পড়তে সহজ হয়।
Generics ব্যবহার সংক্রান্ত সীমাবদ্ধতা
- Primitive ডেটা টাইপ (যেমন int, double) সরাসরি Generics এ ব্যবহার করা যায় না। তবে Wrapper ক্লাস (যেমন Integer, Double) ব্যবহার করতে হয়।
- Generics টাইপ ইনফরমেশন runtime এ মুছে ফেলা হয় (type erasure), যার ফলে কিছু লিমিটেশন থাকে।
Generics ব্যবহার করলে কোড নিরাপদ, কার্যকর এবং রক্ষণাবেক্ষণ করা সহজ হয়।
Read more