Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

Generic Class

📖توضیحات درس

🎥 این ویدیو قسمت هفتاد و هفتم از بوت‌کمپ رایگان جاواست. 📚 Generics – آشنایی کامل با Generic Class و بازنویسی DynamicArray در این جلسه می‌ریم سراغ یکی از کاربردی‌ترین بخش‌های جنریک در جاوا: Generic Class. اینجا دقیقاً یاد می‌گیریم چطور یک کلاس رو جنریک کنیم، چرا این کار باعث افزایش خوانایی و ایمنی کد می‌شه و چطور می‌تونیم با حذف کامل Type Casting، تجربه بهتر و حرفه‌ای‌تری از برنامه‌نویسی داشته باشیم. 😎✨ در این ویدیو بررسی می‌کنیم: 🔹 تعریف و ساختار کلاس‌های جنریک – در ابتدای ویدیو قدم‌به‌قدم مفهوم Generic Class رو باز می‌کنیم تا پایه‌ای محکم داشته باشی. 🔹 نحوه استفاده عملی از Generic Class – با مثال‌های ساده و قابل‌فهم نشون می‌دیم که چطور می‌تونی یک کلاس رو به‌صورت کامل جنریک طراحی کنی. 🔹 کار با چند پارامتر تایپ (Multiple Type Parameters) – یاد می‌گیری چطور کلاس‌هایی طراحی کنی که چندین پارامتر نوع دارند، مثل Map. 🔹 بازنویسی کلاس Dynamic Array با جنریک – یکی از جذاب‌ترین بخش‌های ویدیو! کلاس DynamicArray رو که قبلاً داشتیم، این بار با جنریک بازطراحی می‌کنیم تا موقع کار با داده‌ها دیگه هیچ نیازی به Type Casting خطرناک نداشته باشیم و کد کاملاً Type-Safe بشه. 💡 لینک سورس‌کد جدید کلاس جنریک: https://github.com/farzadafi/ProgrammingByFarzadAfi/tree/master/01_oop_project/generic-dynamic-array/src لینک داکیومنت تدریس: https://github.com/farzadafi/ProgrammingByFarzadAfi/tree/master/document/generic در پایان هم یک مرور کامل داریم تا نکات کلیدی بهتر در ذهن شما تثبیت بشه. 🔄🧠 💬 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشتی می‌تونی داخل گروه بپرسی؛ من یا مربی‌ها کنارت هستیم 💬🤝 🎯 بوت‌کمپ رایگان جاوا — آموزش پروژه‌محور برای یادگیری اصولی و ورود حرفه‌ای به بازار کار اگر می‌خوای جنریک‌ها رو به شکلی واقعی، کاربردی و قابل‌استفاده در پروژه یاد بگیری، این ویدیو دقیقاً برای توست!
00:25:03🎯رایگان

📄جزوه

مفاهیم کلیدی

  • 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).

  • تضمین کامپایلر جنریک‌ها در جاوا در واقع یک لایه محافظتی برای برنامه‌نویس هستند؛ کامپایلر تضمین می‌کند که اگر نوع داده را مشخص کردید، دیگر نیازی به نگرانی بابت خطاهای تبدیل نوع در زمان اجرا نخواهد بود.