جلسه شماره 84رایگان

Generic Class

00:25:03

توضیحات جلسه

🎥 این ویدیو قسمت هفتاد و هفتم از بوت‌کمپ رایگان جاواست. 📚 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 هر سوالی داشتی می‌تونی داخل گروه بپرسی؛ من یا مربی‌ها کنارت هستیم 💬🤝 🎯 بوت‌کمپ رایگان جاوا — آموزش پروژه‌محور برای یادگیری اصولی و ورود حرفه‌ای به بازار کار اگر می‌خوای جنریک‌ها رو به شکلی واقعی، کاربردی و قابل‌استفاده در پروژه یاد بگیری، این ویدیو دقیقاً برای توست!

جزوه و مستندات

مفاهیم کلیدی

  • Generic Class

کلاسی است که می‌تواند با یک یا چند نوع داده مختلف کار کند. این نوع‌ها به‌عنوان پارامتر ورودی یا همان Type Parameter تعریف می‌شوند. این قابلیت باعث می‌شود یک کد ثابت برای انواع داده مختلف، مانند String، Integer یا کلاس‌های سفارشی، قابل استفاده باشد.

  • Diamond Operator

عملگر <> که برای تعریف یا مشخص کردن نوع داده در کلاس‌های جنریک استفاده می‌شود. این عملگر به کامپایلر اعلام می‌کند که کلاس قرار است با چه Type Parameterای کار کند.

  • Type Parameter

یک نام قراردادی یا Convention است که هنگام تعریف کلاس، به‌عنوان جایگزین نوع داده واقعی قرار می‌گیرد. معمولاً از حروف بزرگ انگلیسی مانند T برای Type و از K و V برای Key و Value استفاده می‌شود.

  • Type Specification

فرآیندی است که در آن، نوع دقیق داده هنگام ایجاد یک نمونه یا Instance از کلاس جنریک مشخص می‌شود. برای مثال، هنگام ساخت شیء با new تعیین می‌کنیم که T قرار است از نوع String باشد.

  • Type Safety

یک مکانیزم امنیتی است که تضمین می‌کند فقط داده‌هایی از نوع مشخص‌شده در کلاس قرار بگیرند. این ویژگی باعث می‌شود اشتباهات در زمان کامپایل یا Compile-time شناسایی شوند و برنامه در زمان اجرا دچار خطا نشود.

  • Compile-time Error در برابر Runtime Exception

در حالت عادی و بدون استفاده از جنریک، اشتباه در تبدیل نوع داده می‌تواند باعث بروز ClassCastException در زمان اجرا شود و برنامه را متوقف کند. جنریک این خطا را به زمان کامپایل منتقل می‌کند تا قبل از اجرای برنامه اصلاح شود.

موارد مصاحبه ای

  • مزیت اصلی استفاده از Generics نسبت به کلاس Object چیست؟

استفاده از Object نیازمند تبدیل نوع دستی یا Casting است. این کار امنیت کد را کاهش می‌دهد و ممکن است در زمان اجرا باعث خطای ClassCastException شود. جنریک‌ها با فراهم کردن Type Safety، نیاز به Casting را حذف می‌کنند و خطاها را در زمان کامپایل شناسایی می‌کنند.

  • تایپ پارامتر در چه زمانی مشخص می‌شود؟

نوع دقیق داده یا Type زمانی مشخص می‌شود که برنامه‌نویس بخواهد یک نمونه یا Instance از آن کلاس ایجاد کند.

  • آیا می‌توان مستقیماً یک آرایه از نوع جنریک، مانند new T، ساخت؟

خیر. در جاوا امکان نمونه‌سازی مستقیم از Type Parameter برای آرایه وجود ندارد. برای حل این مشکل باید از 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 در آن قرار دهد یا خروجی را در متغیری با نوع نامرتبط ذخیره کند، کامپایلر بلافاصله خطا می‌دهد و مانع اجرای کد اشتباه می‌شود. این کار باعث حذف کدهای اضافی برای Casting و افزایش امنیت کل پروژه شد.

بیشتر بدانید

  • قرارداد نام‌گذاری

طبق استانداردهای جاوا، بهتر است برای Type Parameterها از حروف تک‌کاراکتری معنادار استفاده کنید؛ مانند T برای انواع عمومی، E برای عناصر لیست یا Element، و K و V برای نگاشت‌ها یا Key/Value.

  • تضمین کامپایلر

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