سلام دوستان
من چند روزی دارم روی این موضوع Generics کار میکنم...
ولی زیاد در موردش متوجه نمیشم
میشه یکی خیلی ساده موضوع رو توضیح بعده؟
و چنتا هم مثل بزنه
و در چه موردهای استفاده میشه،
مرسی
سلام دوستان
من چند روزی دارم روی این موضوع Generics کار میکنم...
ولی زیاد در موردش متوجه نمیشم
میشه یکی خیلی ساده موضوع رو توضیح بعده؟
و چنتا هم مثل بزنه
و در چه موردهای استفاده میشه،
مرسی
فرض کن می خوای یک سری منطق (کار) برای انواع موجودیت ها به طور یه شکل انجام شه! مثلن می خوای یه stack داشته باشی که هر نوع داده ای رو (فارغ ار نوع اون داده) بتونه push , pop کنه! ok!?
خب حالا کلاس Stack رو چطوری می نویسی؟ اگه فکر کنی می بینی باید یه Object data; توش تعریف کنی که بشه به طور کلی یه شی گرفت و نوع دقیقش معلوم نباشه! و مثلن push این شکلی خواهد شد:
public void push( Object data );
خب این چه بدی ای داره؟ اولین موضوع اینه که شما تایپ واقعی یه data رو گم کردی. موضوع تایپ و تطابق صحیحی نوع داده ها خیلی مهمه! شما فرض کن stackی از int داری! فرض کن stackی از string داری! این ها یه جور کار می کنن اما نمی خوای تو stackی که از int هست بزاری string هم پوش شه! ok!? خب تو این راه خیلی باید خودت کد بزنی چون تایپ data رو گم کردی.
اگه احیانن یه روزی بر اساس تایپش بخوای تصمیمی بگیری نمی تونی و اینکه از نظر طراحی در زبان هایی که ساختار شی ایه تک ریشه ای ندارن (یعنی Object ندارن)امکان پذیر نیست و خیلی امکانات رو هم در مورد data نداری. نهایتن این راه امکان پذیر هست اما راه درستش نیست.
راه درست استفاده از همین Generics هست. از اسمش هم معلومه! شما یه کلاس رو بر اساس یک نوع کلی (عمومی) generic می نویسی تا از مشخص کردن نوع در زمان کد نویسی خلاص شی و بزاری generics نوع رو در زمان اجرا به برنامت بده. (در قالب همون نوع generic که ازش استفاده کردی)
حالا نسخه generic رو ببین:
Class Stack<DataType> {
DataType data;
public void push( DataType data ) {
...
}
}
حالا می تونی موقع استفاده مشخص کنی که stack از چه داده ای می خوای و تمام چک های لازم برای تشخیص همخوانی نوع داده رو برات خود جاوا انجام می ده. پی کد تو کوتاه تر خوانا تر و امن تر می شه!
Stack<String> myStringStack = new Stack<String>();
myStringStack.push( "hehehe" );
Integer i = new Integer( 2 );
myStringStack.push( i ); // Error! type mismatch
نمی دونم تونستم کوتاه پایه ای ترین کاربردش رو توضیح بدم یا نه. ولی Generics از اینجا شروع می شهو این رو بفهمی می تونی بقیه اش رو هم یاد بگیری. کتاب بخون (مثلن کتاب Thinking In Java که کاملن توضیح داده این مطالب رو).
ضمنن به خاطر همین نوع کاربرد Generics که برای کلی سازی یک کلاس بر اساس نوع کلاس دیگه ای و دادن دید یکسان بدون توجه به نوع اون کلاس (یعنی چند ریختی) هست از اون به عنوان Static Polymorphism هم یاد می کنن.
خیلی خیلی خیلی خوب توضیح دادید،
دقیقا متوجه شدم
خیلی عالی بود، فکر کنم این تاپیک بدنها بدرد خیلیا بخوره،
حالا که این بحث شروع شد میتونید در مورد Colletction framework هم یکم توضیح بدید،
چون به این موضوع خیلی مربوط میشه
یکم مثلا در مورد List و Map
چه کارها انجام میدان، فرقشون، قابلیتهاشون و و و...
Collection framework یک کتابخانه استاندارد در Java SE هست برای استفاده از ساختمان داده های مختلف تو برنامه های جاوا
انواع ساختمان داده ها رو داره و عملیاتی که روی هر کدوم هست و با ویژگی های مختلف...
علت ارتباط این دو موضوع بهم اینه که اصولن زمانی که شما می خوای از ساختمان های داده برای نگهداری اشیاتون استفاده کنید بحث تایپ اشیا پیش می آد و... اصولن ساختمان های داده جنریک می تونن یه تایپ (همون تایپ جنریک) از اشیا رو نگهداری کنند. استفاده از ساختمان داده های جنریک کد شما رو امن تر می کنه. مثال:
معمولی:
String data = (String) list.get( i );
ولی در حالت جنریک شما یه لیست از String ها داری پس میگی:
String data = list.get( i) ;
استفاده کردن از cast کد رو می تونه غیر امن و کثیف بکنه! و کد دوم ترجیح داده می شه چون چک لازم رو کامپایلر انجام می ده برا برنامه نویس.
خب! کتابخانه Collection اساسن ۳ مدل اصلی از ساختمان ها رو تعریف می کنه:
۱. مجموعه ها (Set): نمی تونند عضو نکراری داشته باشند.
۲. لیست ها(List): می تونند عضو تکراری داشته باشند.
۳. جدول ها (Map): که برای نگهداری زوج های کلبد-مقدار هستند که می شه باهاشون برای هر کلید یک (یا چند) مقدار رو نگهداری کرد.
هر کدوم اینا چند پیاده سازی ازشون هست مثلن لیست ها هم به صورت لینک لیست LinkList هستند هم به صورت آرایه ArrayList
و مجموعه ها و جدول ها به صورت درختی و هش Hash وپیاده سازی شده اند: HashSet, HashMap, TreeSet, TreeMap
اینکه فرق اینا چیه باید شما مفاهیم ساختمان دادهها رو بدونید. به طور خلاصه درختی ها عناصر رو مرتب نگهداری می کنند ولی hash ها مرتب نگهداری نمی کنند بلکه بر اساس الگوریتم های Hash دسترسی سریع تر می دن.
برنامه نویس بسته به نیازش از هر کدوم از اینها استفاده می کنه...تازه ساختمان های دیگه ای مثل Queue و ... هم داریم...
همین طور نسخه های همروند شون هم هست که برای برنامه هایی که به صورت همروند و موازی اجرا می شن باید استفاده بشن مثل:
ConcurrentHashMap و ...
برای اطلاعات کامل برید بخش Collection کتاب Thinking In Java رو با دقت بخونید.
دوسته عزیز واقعا دستت درد نکنه
خیلی خوب توضیح دادی، مرسی
من توی دانشگاه اینو خندم، ولی خوب متوجه نشدم، ولی با توضیحات شما قشنگ فهمیدم
یکم دیگه گوگل کنم همه چی یاد میگیرم
بازم مرسی