Generic in java First section
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
Generics
ویژگیای در جاوا است که به برنامهنویس اجازه میدهد نوع دادهها را بهصورت پارامتری تعیین کند. این ابزار مانند قالبهایی عمل میکند که میتوان آنها را با انواع مختلف داده، مانند String، Integer یا کلاسهای سفارشی، استفاده کرد؛ بدون اینکه نیاز به بازنویسی کد باشد.
Type Safety
به معنای تضمین امنیت نوع داده در زمان کدنویسی است. این ویژگی باعث میشود اشتباهات مربوط به نوع داده، بهجای زمان اجرا، در همان زمان کامپایل شناسایی شوند.
Casting
فرآیند تبدیل صریح یک شیء از نوع عمومی، مانند Object، به یک نوع خاصتر، مانند Person، است. پیش از معرفی Generics، برای بازیابی دادهها از لیستهای عمومی، استفاده از Casting الزامی بود.
ClassCastException
یک خطا یا Exception است که در زمان اجرا، یعنی Runtime، رخ میدهد. این خطا زمانی ایجاد میشود که برنامه سعی کند شیئی را به کلاسی تبدیل کند که با آن سازگار نیست؛ برای مثال، تبدیل یک خودرو به یک انسان.
Compile Timeدر برابرRuntime
زمان کامپایل مرحلهای است که کدهای نوشتهشده توسط کامپایلر بررسی و ترجمه میشوند. زمان اجرا مرحلهای است که برنامه در حال اجرا شدن است. Generics خطاها را از زمان اجرا به زمان کامپایل منتقل میکند تا برنامه هنگام استفاده دچار کرش نشود.
Code Reusability
به معنای قابلیت استفاده مجدد از کد است. Generics اجازه میدهد یک کلاس یا متد را یکبار بنویسیم و با انواع مختلف داده از آن استفاده کنیم. این کار باعث تمیزتر شدن و بهینهتر شدن برنامه میشود.
موارد مصاحبه ای
- چرا استفاده از
Genericsنسبت به استفاده از کلاسObjectبرتری دارد؟
هرچند کلاس Object امکان ذخیرهسازی هر نوع دادهای را فراهم میکند و باعث Reusability میشود، اما امنیت نوع ندارد. هنگام استفاده از Object، خطاهای مربوط به Casting در زمان اجرا، یعنی Runtime، مشخص میشوند و میتوانند باعث کرش برنامه شوند. اما با استفاده از Generics، این خطاها در زمان کامپایل، یعنی Compile Time، شناسایی میشوند.
- مزایای اصلی استفاده از
Genericsدر جاوا چیست؟
۱. افزایش امنیت نوع، یعنی Type Safety.
۲. حذف نیاز به Explicit Casting یا تبدیل دستی نوع.
۳. شناسایی باگها در زمان کامپایل.
۴. کدنویسی تمیزتر و قابلیت استفاده مجدد از کد.
Genericsاز کدام نسخه به جاوا اضافه شد؟
این ویژگی از نسخه Java 5 به جاوا اضافه شد.
- در چه بخشهایی از برنامه میتوان از
Genericsاستفاده کرد؟
Generics در کلاسها، مانند کلاس Stack، متدها و اینترفیسها، مانند Comparable یا Iterator، قابل استفاده است.
سناریو کاربردی
در این آموزش، یک کلاس DynamicArray، یعنی لیست پویا، بررسی شده است که از آرایهای از جنس Object برای ذخیره دادهها استفاده میکند.
مشکل سناریو بدون جنریک:
وقتی میخواهیم اشیایی از کلاس Person را در این لیست ذخیره کنیم، هنگام بازپسگیری داده، خروجی متد از نوع Object است. برای دسترسی به ویژگیهای کلاس Person، مانند متد printFullName، مجبوریم خروجی را به Person تبدیل کنیم.
خطر جدی:
اگر برنامهنویس بهاشتباه بخواهد دادهای را که از نوع Person است، به کلاس دیگری مانند Car تبدیل کند، کامپایلر جاوا متوجه این اشتباه نمیشود. در نتیجه، برنامه اجرا میشود و ناگهان در زمان اجرا با خطای ClassCastException متوقف میشود.
راهکار با جنریک:
با استفاده از Generics، از همان ابتدا به لیست اعلام میکنیم که فقط اجازه ورود و خروج دادههایی از نوع Person را دارد. در این حالت، دیگر نیازی به نوشتن کدهای مربوط به Casting نیست. اگر اشتباهی در نوع داده رخ دهد، کامپایلر اجازه اجرای برنامه را نمیدهد و همان لحظه به برنامهنویس هشدار میدهد.
بیشتر بدانید
- کاربرد در کتابخانههای جاوا
مفهوم Generics بهصورت گسترده در ساختار Collectionهای جاوا و اینترفیسهای مهمی مانند Comparable و Function استفاده شده است.
- تمیزی کد یا
Clean Code
استفاده از Generics باعث میشود کدهای اضافه مربوط به تبدیل انواع، یعنی Casting، حذف شوند. این موضوع خوانایی کد را افزایش میدهد و نگهداری آن را آسانتر میکند.
