জাভা জেনেরিক্সে, মেথড এবং কনস্ট্রাক্টরেও জেনেরিক্স ব্যবহার করা যায়। এগুলো ডেটা টাইপ নির্ধারণের স্বাধীনতা দেয় এবং টাইপ সেফটি নিশ্চিত করে। জেনেরিক মেথড বা কনস্ট্রাক্টর নির্দিষ্ট কোনো ক্লাসের সাথে যুক্ত না থেকেও বিভিন্ন টাইপের ডেটার জন্য কাজ করতে পারে।
জেনেরিক মেথড হলো এমন একটি মেথড যা নিজস্ব টাইপ প্যারামিটার ব্যবহার করে। এটি ক্লাস জেনেরিক না হলেও মেথড লেভেলে কাজ করে।
public <T> ReturnType methodName(T parameter) {
// মেথডের লজিক
}
public class GenericMethodExample {
// জেনেরিক মেথড
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
public static void main(String[] args) {
String[] stringArray = {"Java", "Generics", "Method"};
Integer[] intArray = {1, 2, 3};
// স্ট্রিং টাইপ অ্যারে প্রিন্ট
printArray(stringArray);
// ইন্টিজার টাইপ অ্যারে প্রিন্ট
printArray(intArray);
}
}
বিস্তারিত:
<T>
টাইপ প্যারামিটার মেথডের জন্য নির্ধারিত।String
এবং Integer
) এর জন্য কাজ করে।জেনেরিক কনস্ট্রাক্টর হলো এমন একটি কনস্ট্রাক্টর যা জেনেরিক টাইপ প্যারামিটার গ্রহণ করে। এটি একটি জেনেরিক টাইপ ক্লাসের অংশ হতে পারে, আবার নাও হতে পারে।
public <T> ClassName(T parameter) {
// কনস্ট্রাক্টরের লজিক
}
public class GenericConstructorExample {
private String data;
// জেনেরিক কনস্ট্রাক্টর
public <T> GenericConstructorExample(T input) {
this.data = input.toString();
}
public void display() {
System.out.println("Data: " + data);
}
public static void main(String[] args) {
GenericConstructorExample obj1 = new GenericConstructorExample(123);
obj1.display();
GenericConstructorExample obj2 = new GenericConstructorExample("Hello Generics");
obj2.display();
}
}
বিস্তারিত:
<T>
টাইপ প্যারামিটার কনস্ট্রাক্টরের জন্য নির্ধারিত।Integer
, String
ইত্যাদি) গ্রহণ করতে পারে।toString()
ব্যবহার করে স্টোর করে।Generics Methods এবং Constructors জাভা প্রোগ্রামিংয়ে ডেটা টাইপের উপর নির্ভরতা কমায় এবং কোডকে আরও শক্তিশালী ও নিরাপদ করে তোলে। এটি জাভা প্রোগ্রামের কার্যকারিতা বাড়ায় এবং টাইপ সংক্রান্ত ত্রুটি থেকে রক্ষা করে।
Generic Methods হলো জাভা মেথড যা টাইপ প্যারামিটার ব্যবহার করে, অর্থাৎ মেথডটি বিভিন্ন ডেটা টাইপের সাথে কাজ করতে পারে। এটি মেথডের উপর ভিত্তি করে নির্দিষ্ট ডেটা টাইপ নির্ধারণের জন্য ব্যবহৃত হয়।
Generic Methods জাভার Generics ফিচারের অংশ এবং এটি জাভা 5-এ প্রবর্তিত হয়েছিল।
Generic Methods এমন একটি মেথড যা একটি বা একাধিক টাইপ প্যারামিটার গ্রহণ করে। এই প্যারামিটারগুলো <T>
এর মতো চিহ্নিত করা হয় এবং সাধারণত মেথড সিগনেচারের আগে উল্লেখ করা হয়।
Generic Method এর সাধারণ গঠন:
public <T> ReturnType methodName(T parameter) {
// Method body
}
এখানে:
<T>
টাইপ প্যারামিটার নির্দেশ করে।T
যেকোনো ডেটা টাইপের প্রতিনিধিত্ব করে (যেমন, Integer
, String
, ইত্যাদি)।<T, U, V>
)।public class GenericMethodExample {
// A Generic Method
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
public static void main(String[] args) {
Integer[] intArray = {1, 2, 3};
String[] stringArray = {"A", "B", "C"};
System.out.println("Integer Array:");
printArray(intArray); // Prints Integer array
System.out.println("String Array:");
printArray(stringArray); // Prints String array
}
}
ফলাফল:
Integer Array:
1
2
3
String Array:
A
B
C
public class GenericMethodExample {
public static <T, U> void displayValues(T value1, U value2) {
System.out.println("Value 1: " + value1);
System.out.println("Value 2: " + value2);
}
public static void main(String[] args) {
displayValues("Hello", 123); // String and Integer
displayValues(10.5, true); // Double and Boolean
}
}
ফলাফল:
Value 1: Hello
Value 2: 123
Value 1: 10.5
Value 2: true
<T>
মেথড সিগনেচারের আগে ডিফাইন করা হয়। এটি মেথডকে বিভিন্ন টাইপের ডেটা গ্রহণ করার অনুমতি দেয়।টাইপ ইনফারেন্স:
মেথড কল করার সময় জাভা স্বয়ংক্রিয়ভাবে টাইপ ইনফার করতে পারে। উদাহরণস্বরূপ:
printArray(new String[]{"A", "B", "C"});
টাইপ সীমাবদ্ধ করা (Bounded Type Parameters):
Generic Methods নির্দিষ্ট টাইপ বা টাইপের একটি সীমাবদ্ধতা সেট করতে পারে।
public static <T extends Number> void displayNumber(T number) {
System.out.println("Number: " + number);
}
এখানে, T
শুধুমাত্র Number
অথবা তার সাবক্লাস (যেমন Integer
, Double
) হতে পারে।
public class BoundedGenericMethod {
// Only allows Number and its subclasses
public static <T extends Number> double addNumbers(T num1, T num2) {
return num1.doubleValue() + num2.doubleValue();
}
public static void main(String[] args) {
System.out.println(addNumbers(5, 10)); // Integer addition
System.out.println(addNumbers(5.5, 2.3)); // Double addition
// addNumbers("Hello", "World"); // Compile-time error
}
}
ফলাফল:
15.0
7.8
Generic Methods হলো জাভার একটি শক্তিশালী ফিচার যা টাইপ প্যারামিটার ব্যবহার করে মেথডকে আরো বহুমুখী এবং পুনঃব্যবহারযোগ্য করে তোলে। এটি টাইপ সেফটি নিশ্চিত করে এবং কম্পাইল টাইমে টাইপ ত্রুটি চিহ্নিত করতে সাহায্য করে। টাইপ সীমাবদ্ধতা এবং টাইপ ইনফারেন্স এর মাধ্যমে Generic Methods জাভার উন্নত প্রোগ্রামিং অভিজ্ঞতা প্রদান করে।
Java Generics-এ Generic Methods ব্যবহার করে আমরা টাইপ-স্বাধীন কোড লিখতে পারি। একটি Generic Method সেই পদ্ধতিকে বোঝায় যেখানে একটি বা একাধিক টাইপ প্যারামিটার পদ্ধতির সংজ্ঞায় ব্যবহৃত হয়। এটি কোডের পুনর্ব্যবহারযোগ্যতা বাড়ায় এবং টাইপ সেফটি নিশ্চিত করে।
modifier <T> returnType methodName(T parameter) {
// Method body
}
public
, private
, ইত্যাদি)।<T>
হল টাইপ প্যারামিটার। এটি কম্পাইল টাইমে নির্দিষ্ট টাইপ দ্বারা প্রতিস্থাপিত হয়। এটি পদ্ধতির নামের আগে ঘোষণা করা হয়।T
, E
, K
, V
, ইত্যাদি সাধারণত টাইপ প্যারামিটার হিসেবে ব্যবহৃত হয়।public class GenericExample {
// Generic Method
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
public static void main(String[] args) {
Integer[] intArray = {1, 2, 3};
String[] strArray = {"Hello", "World"};
// Method call with Integer array
printArray(intArray);
// Method call with String array
printArray(strArray);
}
}
আউটপুট:
1
2
3
Hello
World
public class GenericExample {
// Generic Method with two type parameters
public static <T, U> void display(T first, U second) {
System.out.println("First: " + first);
System.out.println("Second: " + second);
}
public static void main(String[] args) {
display(10, "Generics");
display(3.14, true);
}
}
আউটপুট:
First: 10
Second: Generics
First: 3.14
Second: true
public class GenericExample {
// Generic Method with bounded type parameter
public static <T extends Number> void printDouble(T number) {
System.out.println("Double value: " + (number.doubleValue() * 2));
}
public static void main(String[] args) {
printDouble(5); // Integer
printDouble(3.14); // Double
}
}
আউটপুট:
Double value: 10.0
Double value: 6.28
public class GenericClass<T> {
private T data;
public GenericClass(T data) {
this.data = data;
}
// Generic Method
public <U> void print(U additionalData) {
System.out.println("Data: " + data);
System.out.println("Additional Data: " + additionalData);
}
public static void main(String[] args) {
GenericClass<String> example = new GenericClass<>("Hello");
example.print(123); // Generic Method call
}
}
আউটপুট:
Data: Hello
Additional Data: 123
Java Generics এর মাধ্যমে কনস্ট্রাক্টরকে জেনেরিক করা যায়। Generic Constructor এমন একটি কনস্ট্রাক্টর যা জেনেরিক টাইপ প্যারামিটার গ্রহণ করে এবং এটি কনস্ট্রাক্টরের সাথে ব্যবহার করা হয়। Generic Constructor মূলত একটি নির্দিষ্ট ক্লাসের কনস্ট্রাক্টর হলেও এর নিজস্ব জেনেরিক টাইপ প্যারামিটার থাকতে পারে।
class ClassName {
// Generic Constructor
<T> ClassName(T parameter) {
System.out.println("Parameter: " + parameter);
}
}
class GenericConstructorDemo {
// Generic Constructor
<T> GenericConstructorDemo(T parameter) {
System.out.println("Constructor Parameter: " + parameter);
}
public static void main(String[] args) {
GenericConstructorDemo obj1 = new GenericConstructorDemo(123); // Integer
GenericConstructorDemo obj2 = new GenericConstructorDemo("Java Generics"); // String
GenericConstructorDemo obj3 = new GenericConstructorDemo(45.67); // Double
}
}
আউটপুট:
Constructor Parameter: 123
Constructor Parameter: Java Generics
Constructor Parameter: 45.67
class GenericClass<T> {
private T data;
// Generic Constructor
<U> GenericClass(U parameter) {
System.out.println("Constructor Parameter: " + parameter);
}
public void setData(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
public class Main {
public static void main(String[] args) {
GenericClass<String> obj = new GenericClass<>(100); // Constructor with Integer
obj.setData("Hello Generics");
System.out.println("Data: " + obj.getData());
}
}
আউটপুট:
Constructor Parameter: 100
Data: Hello Generics
class Calculator {
private double result;
// Generic Constructor
<T extends Number> Calculator(T number1, T number2) {
result = number1.doubleValue() + number2.doubleValue();
System.out.println("Sum: " + result);
}
public double getResult() {
return result;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc1 = new Calculator(10, 20); // Integer
Calculator calc2 = new Calculator(15.5, 4.5); // Double
}
}
আউটপুট:
Sum: 30.0
Sum: 20.0
Generic Constructor প্রোগ্রামের নমনীয়তা বৃদ্ধি করে এবং টাইপ সেফ কোড নিশ্চিত করে। এটি জাভার জেনেরিক্সের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ডেটা টাইপের নির্দিষ্টতা বজায় রেখে একই লজিক বিভিন্ন পরিস্থিতিতে প্রয়োগ করতে দেয়।
Generics জাভাতে কোডের পুনঃব্যবহারযোগ্যতা এবং টাইপ সেফটি নিশ্চিত করতে ব্যবহৃত হয়। Multiple Type Parameters এবং Generic Return Types এর সাহায্যে কোড আরও ফ্লেক্সিবল এবং ডাইনামিক হয়।
Generics-এ একাধিক টাইপ প্যারামিটার ব্যবহার করার সুবিধা রয়েছে। একাধিক টাইপ প্যারামিটার একটি ক্লাস, ইন্টারফেস, বা মেথডে একসাথে ব্যবহার করা যেতে পারে।
public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
public class Main {
public static void main(String[] args) {
// String and Integer type parameters
Pair<String, Integer> pair = new Pair<>("Age", 25);
System.out.println("Key: " + pair.getKey());
System.out.println("Value: " + pair.getValue());
// Integer and String type parameters
Pair<Integer, String> anotherPair = new Pair<>(101, "Alice");
System.out.println("Key: " + anotherPair.getKey());
System.out.println("Value: " + anotherPair.getValue());
}
}
Key: Age
Value: 25
Key: 101
Value: Alice
Generics মেথডের রিটার্ন টাইপও হতে পারে। এই পদ্ধতিতে, মেথড বিভিন্ন ডেটা টাইপের সাথে কাজ করতে পারে এবং উপযুক্ত টাইপের ডেটা রিটার্ন করতে পারে।
public class Util {
public static <T> T getValue(T value) {
return value;
}
}
public class Main {
public static void main(String[] args) {
String str = Util.getValue("Hello Generics");
Integer num = Util.getValue(100);
System.out.println("String Value: " + str);
System.out.println("Integer Value: " + num);
}
}
String Value: Hello Generics
Integer Value: 100
একটি মেথডে একাধিক টাইপ প্যারামিটার ব্যবহার করা যায়।
public class Util {
public static <K, V> void displayPair(K key, V value) {
System.out.println("Key: " + key + ", Value: " + value);
}
}
public class Main {
public static void main(String[] args) {
Util.displayPair("Name", "John Doe");
Util.displayPair(101, 500.75);
}
}
Key: Name, Value: John Doe
Key: 101, Value: 500.75
Java Collections Framework-এ অনেক ক্ষেত্রে Multiple Type Parameters ব্যবহার করা হয়। যেমন: Map<K, V>
।
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "Alice");
map.put(2, "Bob");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
Key: 1, Value: Alice
Key: 2, Value: Bob
Generics এর এই বৈশিষ্ট্যগুলো জাভা প্রোগ্রামিংকে আরও ফ্লেক্সিবল এবং পুনরায় ব্যবহারযোগ্য করে তোলে।
Read more