Generic Class
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
-
Generic Class کلاسی است که میتواند با یک یا چند نوع دادهای مختلف که به عنوان پارامتر ورودی (Type Parameter) تعریف میشوند، کار کند. این ویژگی اجازه میدهد یک کد ثابت برای انواع دادههای مختلف (مثل String، Integer یا کلاسهای سفارشی) قابل استفاده باشد.
-
Diamond Operator (<>) علامت کوچکتر و بزرگتری که برای تعریف یا مشخص کردن نوع داده در کلاسهای جنریک استفاده میشود. این عملگر به کامپایلر میفهماند که کلاس قرار است با چه تایپ پارامتری کار کند.
-
Type Parameter یک نام قراردادی (Convention) که به عنوان جایگزین برای نوع داده واقعی در زمان تعریف کلاس قرار میگیرد. معمولاً از حروف بزرگ انگلیسی مثل
Tبرای Type، یاKوVبرای Key و Value استفاده میشود. -
Type Specification فرآیندی که در آن، نوع دقیق داده در زمان ایجاد یک نمونه (Instance) از کلاس جنریک مشخص میشود. مثلاً در زمان
newکردن کلاس، تعیین میکنیم کهTقرار استStringباشد. -
Type Safety یک مکانیزم امنیتی که تضمین میکند فقط دادههایی از نوع مشخص شده در کلاس قرار بگیرند. این کار باعث میشود اشتباهات در زمان کامپایل (Compile-time) شناسایی شوند و برنامه در زمان اجرا دچار خطا نشود.
-
Compile-time Error vs Runtime Exception در حالت عادی (بدون جنریک)، اشتباه در تبدیل نوع داده باعث بروز
ClassCastExceptionدر زمان اجرا میشود که منجر به توقف برنامه خواهد شد. جنریک این خطا را به زمان کامپایل منتقل میکند تا قبل از اجرای برنامه اصلاح شود.
موارد مصاحبه ای
-
مزیت اصلی استفاده از Generics نسبت به کلاس Object چیست؟ استفاده از
Objectنیاز به تبدیل نوع دستی (Casting) دارد که امنیت کد را پایین میآورد و ممکن است منجر به خطایClassCastExceptionدر زمان اجرا شود. جنریکها با فراهم کردن Type Safety، نیاز به کستینگ را حذف کرده و خطاها را در زمان کامپایل شناسایی میکنند. -
تایپ پارامتر در چه زمانی مشخص میشود؟ نوع دقیق داده (Type) زمانی مشخص میشود که برنامهنویس میخواهد یک اینستنس (Instance) یا شیء از آن کلاس ایجاد کند.
-
آیا میتوان مستقیماً یک آرایه از نوع جنریک (مثلاً new T) ساخت؟ خیر، در جاوا امکان نمونهسازی مستقیم از تایپ پارامتر برای آرایه وجود ندارد. برای حل این مشکل باید از
Reflectionو متدArray.newInstanceاستفاده کرد و نوع کلاس (Class<T>) را به آن پاس داد. -
منظور از Raw Use در کلاسهای جنریک چیست؟ استفاده از یک کلاس جنریک بدون تعیین نوع داده در داخل علامت
<>. این کار باعث میشود کامپایلر هشدار (Warning) دهد، زیرا امنیت تایپی که جنریک فراهم میکند در این حالت نادیده گرفته شده است. -
چرا در پیادهسازی داخلی مجموعههای جنریک از انوتیشن SuppressWarnings استفاده میشود؟ زمانی که برنامهنویس از امنیت تبدیل نوع (Casting) در داخل کدهای بازنویسی شده اطمینان دارد اما کامپایلر همچنان هشدار میدهد، با استفاده از
@SuppressWarnings("unchecked")به کامپایلر اعلام میکند که بررسیهای لازم انجام شده و هشدار را نادیده بگیرد.
سناریو کاربردی
در این آموزش، یک کلاس DynamicArray که قبلاً با نوع داده Object نوشته شده بود، با استفاده از جنریکها بازنویسی شد.
۱. ابتدا کلاس به صورت DynamicArray<T> تعریف شد تا بتواند هر نوع دادهای را بپذیرد.
۲. مشکل عدم امکان ساخت آرایه مستقیم با new T[] از طریق دریافت Class<T> در سازنده (Constructor) و استفاده از ابزار Reflection حل شد.
۳. نتیجه این شد که وقتی یک DynamicArray<String> ساخته میشود، متد get مستقیماً خروجی String میدهد و اگر برنامهنویس بخواهد اشتباهاً یک عدد (Integer) در آن بریزد یا خروجی را در متغیر نامرتبط ذخیره کند، کامپایلر بلافاصله خطا داده و مانع از اجرای کد اشتباه میشود. این کار باعث حذف کدهای اضافی برای کستینگ و بالا رفتن امنیت کل پروژه شد.
بیشتر بدانید
-
قرارداد نامگذاری طبق استانداردهای جاوا، بهتر است برای تایپ پارامترها از حروف تککاراکتری معنادار استفاده کنید:
Tبرای انواع عمومی،Eبرای عناصر لیست (Element)، وK, Vبرای نگاشتها (Key/Value). -
تضمین کامپایلر جنریکها در جاوا در واقع یک لایه محافظتی برای برنامهنویس هستند؛ کامپایلر تضمین میکند که اگر نوع داده را مشخص کردید، دیگر نیازی به نگرانی بابت خطاهای تبدیل نوع در زمان اجرا نخواهد بود.
