ভাই, সহজ বাংলায় বলতে গেলে জেনেরিকস হলো এমন একটা কোড যে কোডে আমরা ডেটা টাইপ বলে দিব না, মানে বুঝেন নাই তো?
আমরা ভ্যারিয়েবল ডিক্লেয়ার করার সময় এমন করি না?
int a=5 ;
double b=5.6 ;
char ch='c' ;
তো এইখানে (int,double,char) এগুলা হলো ডেটা টাইপ। এইখানে কাজ করার জন্য আমাদের আগে থেকে ভ্যারিয়েবল টাইপ বলে দিতে হচ্ছে। কিন্তু ‘জেনেরিকস’ হলো এমন একটা প্রসেস যেখানে আমরা ডেটা টাইপ উল্লেখ করব না, আমাদের প্রয়োজন মত ডেটা টাইপ পাস করে দিব আর সেই টাইপ অনুযায়ী আউটপুট পাব।আমরা এতদিন ভ্যারিয়েবল পাস করেছি, রেফারেন্স পাস করেছি, কিন্তু এখন ডেটা টাইপ পাস করব (int, char, double)।
যেমনঃ ধরেন আমরা দুইটা সংখ্যা যোগ করার একটা মেথড লিখতে চাই,
public int sum(int a,int b){
return a+b;
}
এইখানে টাইপ দিয়েছি int , এখন আমরা যদি a=5.65 , b=10.55 দেই তাহলে কি আমরা আসল উত্তরটা পাব? না, পাব না। কারণ ডেটা টাইপ ইন্টিজার তাই উত্তর 5 + 10 = 15 দিয়ে দিবে।
আমরা যদি আসল উত্তরটা পেতে চাই, তাহলে আমাদের কি করতে হবে ? আরেকটা মেথড লিখতে হবে যেখানে ভ্যারিয়েবল টাইপ দিব double।
double sum(double a,double b){
return a+b;
}
খেয়াল করেন, এইখানে আমাদের কাজের প্রসেস কিন্তু একটাই , শুধু ২টা সংখ্যা যোগ করে দিয়ে দিব। কিন্ত (int , double) টাইপ আলাদা হউয়ার কারণে আমাদের একই কোড দুইবার লিখা লাগছে, এই ঝামেলাটা যেন না করা লাগে তাই আসছে জেনেরিকস ।
জেনেরিক দিয়ে কোডঃ
নিজেকে ডেটা টাইপ বানিয়ে ফেলব এখন 😜
1. public class
Main<Rifat>{
2. Rifat a; //Rifat এখন ডেটা টাইপ, 'a' ভ্যারিয়েবল
3. public Main(Rifat a){
4. this.a=a;
}
5. public Rifat getObj(){
6. return a;
}
7. public void showType(){
8. System.out.println("Type of Rifat: "+a.getClass().getName());
}
9. public static void main(String[] args) {
10. Main<Integer> obj=new Main(6);
11. System.out.println(obj.getObj());
12. obj.showType();
13. Main<Double> obj1=new Main(5.55);
14. System.out.println(obj1.getObj());
15. obj1.showType();
}
}
আউটপুটঃ
6
Type of Rifat: java.lang.Integer //Output of Line 12
5.55
Type of Rifat: java.lang.Double //Output of Line 15
BUILD SUCCESSFUL (total time: 0 seconds)
১ নাম্বার লাইনটা আগে লিখতাম
public class Main{
}
কিন্ত এখন লিখলাম
public class Main<Rifat>{
}
এইখানে <Rifat> এইটা প্লেসহোল্ডার (শূন্যস্থান) মাত্র, এইখানে যা খুশি তাই লিখতে পারবেন, মানে আমরা মেইন মেথড থেকে টাইপ যেটা পাস করব এর মধ্যে সেটা আসবে কি লিখেছেন এইখানে এইটা ফ্যাক্ট না, যেমনঃ
আগে লিখতাম
int a;
কিন্তু এখন,
Rifat a ; //Line 2
মানে Rifat নিজেই একটা ডেটা টাইপ হয়ে গেছে, কিন্তু কোন ডেটা টাইপ?
আমরা যখন
Main<Integer> obj=new Main(6);
//Line 10
Main"<Integer>"
ইন্টিজার পাস করলাম, তাই এখন ইন্টিজার ডেটা টাইপ হিসেবে কাজ করবে
তখন Rifat এর জায়গায় Internally int a ( Rifat a ; ) এভাবে থাকে, তাই এইটার টাইপ প্রিন্ট করার সময় দেখালো java.lang.Integer, আবার ডবল নিয়ে কাজ করলে
Main<Double> obj=new Main(65.45);
//Line 13
এইবার Double পাস করলাম, তাই code এ Rifat লিখা জায়গায় Double থাকলে যা করত, সেভাবে কাজ করবে, Rifat দেন বা অন্য কিছু দেন ঐটা একটা শূন্যস্থানের মত কাজ করবে (Fill in the gap type)
এখন Rifat a (double a) এর মত কাজ করবে, তাহলে খেয়াল করেন getObj() মেথড লিখেছি একবার ই, সব লিখেছি একবার কিন্তু Main<Double>, Main<Integer> টাইপ চেঞ্জ করে ঐটাকেই বিভিন্নভাবে ব্যবহার করতে পারলাম, এইটাই জেনেরিকসের প্রধান কাজ।
public class Main<যেকোনো_নাম>{
যেকোনো_নাম a ;
}
জেনেরিকস অবজেক্ট নিয়ে কাজ করে, তাই আমরা Main<int> লিখতে পারব না র্যাপার(wrapper) ক্লাস ইউজ করা লাগবে, এভাবে Main<Integer>
ArrayList জেনেরিকসের মত কাজ করে,
ArrayList<Integer>
ArrayList<String>
ArrayList<Class_Name>
etc etc etc . . .
Comments
Post a Comment