জাভা জেনেরিক্স মূলত টাইপ সেফটি নিশ্চিত করার জন্য ডিজাইন করা হয়েছে এবং এর প্রধান প্রভাব compile-time এ দেখা যায়। তবে runtime এ Generics-এর আচরণ কিছুটা ভিন্ন, কারণ জাভা Generics টাইপ ইরেজার (type erasure) নামে একটি প্রক্রিয়া ব্যবহার করে।
Compile-Time এ Generics এর ভূমিকা
টাইপ সেফটি নিশ্চিত করা:
- Generics কম্পাইল টাইমে টাইপ চেকিং সম্পন্ন করে। ফলে ডেটা টাইপ সম্পর্কিত ত্রুটি (type mismatch errors) কম্পাইল টাইমেই ধরা যায়।
- এটি কোডকে আরও নির্ভুল এবং নিরাপদ করে তোলে।
উদাহরণ:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Java"); list.add(10); // Compile-time error } }ত্রুটি বার্তা:
incompatible types: int cannot be converted to Stringটাইপ কাস্টিং এর প্রয়োজনীয়তা দূর করা:
- Generics ব্যবহারের ফলে টাইপ কাস্টিং করার দরকার হয় না। এটি কোডকে সহজ করে এবং runtime errors কমায়।
উদাহরণ:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Generics"); String item = list.get(0); // No casting needed System.out.println(item); } }- কোড পুনর্ব্যবহারযোগ্যতা (Code Reusability):
- Generics ক্লাস এবং মেথড বিভিন্ন টাইপের ডেটার জন্য ব্যবহার করা যায়।
Runtime এ Generics এর ভূমিকা
জাভার type erasure এর কারণে runtime এ Generics এর টাইপ ইনফরমেশন মুছে ফেলা হয়। ফলে Generics এর টাইপ সম্পর্কিত বেশিরভাগ তথ্য compile-time এ সীমাবদ্ধ থাকে।
Runtime এর ভূমিকা:
Type Erasure:
- Generics এর টাইপ ইনফরমেশন runtime এ ইরেজ হয়ে যায়।
- এর ফলে JVM শুধুমাত্র raw টাইপের উপর কাজ করে।
উদাহরণ:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> stringList = new ArrayList<>(); List<Integer> intList = new ArrayList<>(); System.out.println(stringList.getClass() == intList.getClass()); // true } }আউটপুট:
trueব্যাখ্যা:
Compile-time এList<String>এবংList<Integer>আলাদা মনে হলেও, runtime এListএর টাইপ ইরেজ হয়ে যায়। তাই একই ক্লাস টাইপ হিসেবে দেখা যায়।Type Safety Runtime এ প্রয়োগ হয় না:
- Generics runtime এ টাইপ চেক করতে পারে না। এটি compile-time এর কাজ।
- runtime এ টাইপ চেকিং এর জন্য
instanceofকাজ করে না।
উদাহরণ:
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); if (list instanceof ArrayList<String>) { // Compile-time error System.out.println("This will not compile"); } } }Backward Compatibility:
- Generics এর টাইপ ইরেজারের কারণে জাভার পুরনো (non-generic) কোডের সাথে Compatibility বজায় থাকে।
- Generics ব্যবহার করলে পুরনো
rawটাইপ ডেটার সাথে কাজ করানো সম্ভব।
উদাহরণ:
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); // Raw type list.add("Java"); list.add(10); for (Object obj : list) { System.out.println(obj); } } }আউটপুট:
Java 10
Compile-Time এবং Runtime এর তুলনা
| বৈশিষ্ট্য | Compile-Time | Runtime |
|---|---|---|
| টাইপ চেকিং | Generics টাইপ চেকিং সম্পন্ন করে। | টাইপ ইনফরমেশন মুছে ফেলা হয়। |
| টাইপ ইনফরমেশন | Generics টাইপের তথ্য দৃশ্যমান থাকে। | টাইপ ইরেজার এর কারণে অদৃশ্য। |
| টাইপ সেফটি | টাইপ সেফটি নিশ্চিত করে। | টাইপ সেফটি runtime এ প্রযোজ্য নয়। |
| Backward Compatibility | Compile-Time এ নিশ্চিত। | Runtime এ পুরনো কোড সাপোর্ট করে। |
- Compile-Time: জেনেরিক্স টাইপ চেকিং, টাইপ সেফটি এবং টাইপ কাস্টিং এড়িয়ে কোড সহজ করে।
- Runtime: টাইপ ইরেজারের কারণে Generics-এর কার্যক্ষমতা সীমিত, তবে এটি জাভার backward compatibility বজায় রাখতে সাহায্য করে।
Generics মূলত compile-time টাইপ নিরাপত্তা নিশ্চিত করতে এবং runtime এ কার্যক্ষমতার সাথে পুরনো কোডের সামঞ্জস্য বজায় রাখতে গুরুত্বপূর্ণ ভূমিকা পালন করে।
Read more