کلاس های Generic در جاوا
حتما برای شما پیش آمده است که از کلاس List در جاوا استفاده کنید. List میتواند داده ها از هر نوع کلاسی را در خود نگهداری کند. به این خاصیت, Generic گویند و در این مقاله قصد داریم تا کلاس های Generic را مورد بررسی قرار دهیم.
متد های Generic, باید در کلاس Generic پیاده سازی شوند. در واقع هدف اصلی پیاده سازی این نوع کلاس ها, استفاده از متد های آن است. متد های Generic این خاصیت را دارند که متغیر ها را بدون وابستگی به نوع آنها دریافت و پردازش کند. همانطور که در ابتدای مقاله اشاره شد, List نیز یکی از چنین کلاس ها است. میتوانیم یک لیست از String و یا Integer داشته باشیم. در واقع نوع متغیر در اینجا مطرح نیست. پیاده سازی کلاس Generic به این صورت است:
public class ZeroToHero<T> { }
نشانه “<T>” به این معنا است که این کلاس از نوع generic و در طول استفاده از کلاس, به عنوان متغیر generic ما است. البته استفاده از حرف T الزامی نیست و انتخاب آن به اختیار برنامه نویس است. اکنون یک متد را پیاده سازی میکنیم:
public class ZeroToHero<CustomName> { void getType(CustomName params) { if (params instanceof String) { System.out.println("String"); } else if (params instanceof Number){ System.out.println("Integer"); } else if (params instanceof Character) { System.out.println("Char"); } else if (params instanceof List) { System.out.println("List"); } else { System.out.println("Unknown"); } } }
با استفاده از این متد, مشخص میکنیم که متغیر ارسال شده از چه نوعی است:
public static void main(String[] args) { ZeroToHero stringZeroToHero = new ZeroToHero<>(); stringZeroToHero.getType("Vahid"); // Output : String stringZeroToHero.getType(2); // Output : Number stringZeroToHero.getType(new ArrayList<>()); // Output : List stringZeroToHero.getType('C'); // Output : Char stringZeroToHero.getType(new Runner()); // Output : Unknown }
در کلاس فوق, هر نوع متغیری را که به کلاس ارسال کنیم مجاز است. اما میتوانیم کلاس را محدود به نوع خاصی کنیم:
ZeroToHero<String> stringZeroToHero = new ZeroToHero<>();
اکنون این کلاس تنها برای متغیر هایی که از نوع کلاس String هستند و یا از آن ارث بری کردهاند, قابل استفاده است. همچنین میتوانیم متغیر های درون کلاس را نیز محدود کنیم:
public class ZeroToHero<CustomName extends Number>
بر اساس کد فوق, مشخص کردهایم که تنها متغیر هایی که از کلاس Number ارث بری کرده باشند, میتوانند از این کلاس استفاده کنند. ایجاد چنین محدودیتی گاهی لازم است. فرض کنید یک متد برای جمع دو عدد داریم. حال اگر بخواهیم این متد را با استفاده از Generic پیاده سازی کنیم, باید متغیر های ارسالی به کلاس حتما از نوع عددی باشند:
public class ZeroToHero<MyNUmber extends Number> { public void addNumbers(MyNUmber a, MyNUmber b) { System.out.println(add(a, b)); } private Number add(Number a, Number b) { return a.intValue() + b.intValue(); } }
و برای استفاه از آن به این صورت عمل میکنیم:
ZeroToHero zeroToHero=new ZeroToHero(); zeroToHero.addNumbers(2, 3); // Output : 5 zeroToHero.addNumbers(3f, 5f); // Output : 8 zeroToHero.addNumbers(32.324, 3234.324); // Output : 3266
اگر بخواهیم موقع ایجاد instance از کلاس ZeroToHero, نوع متغیر هارا غیر عدد مشخص کنیم, با خطا مواجه میشویم.
دلایل استفاده از Generic
اکنون باید فواید استفاده از Generic را بررسی کنیم. یکی از دلایل استفاده از چنین کلاس هایی, امکان استفاده مجدد از یک کد است. چون متد ها به نوع متغیر وابسته نیستد و میتوانیم از یک متد برای چندین نوع متغیر استفاده کنیم. گاهی برنامه نویسان سعی میکنند از کلاس Object استفاده کنند. به این ترتیب هر نوع متغیری را میتوانند به متد ارسال کنند. اما با این تفاوت که برای استفاده از چنین متد هایی حتما باید عمل Casting انجام شود و همین امر احتمال وقوع خطا را افزایش و همچنین خوانایی کد را کاهش میدهد. بنابراین بهتر است بجای استفاده از کلاس Object, از کلاس های generic استفاده کنیم.
در این مقاله سعی بر این شد تا شیوه پیاده سازی چنین کلاس هایی را بررسی کنیم. مهارت در پیاده سازی بجا و درست چنین کلاس هایی باعث میشود تا برنامه نویسان بتوانند بهتر و بهینه تر کدنویسی کنند.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.