آموزش جاوا (Java) قسمت 48 : معرفی و آموزش جنریک (Generic)

با سلام به همه دوستان و همراهان Itpro. آیا تا به حال فکر کرده اید که اگر یک متد مرتب سازی داشتیم که اگر داده int به متد می دادیم همان متد می توانست داده های int را مرتب کند و اگر داده string به آن می دادیم می توانست آنها را مرتب کند و یا هر نوع داده را به آن می دادیم می توانست آن را مرتب کند. دقت کنید که فقط یک متد باشد نه این که با استفاده از overload کردن متدها برای هر نوع داده ای یک متد جدا بنویسیم. فقط یک متد داشته باشیم که بتواند با هر نوع داده ای کار کرده و عمل مرتب سازی را بر روی آن انجام دهد. این کار شدنی است. با استفاده از متدها و کلاس های جنریک (generic) در جاوا می توان این کار را انجام داد. با استفاده از امکان جنریک شما می توانید یک متد معرفی کنید و این متد برای چندین نوع داده کار خواهد کرد. یا می توانید یک کلاس جنریک تعریف کنید که داخل کلاس یک مجموعه متدها وجود داشته باشد که با انواع داده های مختلف کار کند. همچنین انواع داده جنریک را می توان در زمان کامپایل بررسی کرد تا اگر نوع داده ای نامعتبر است بتوان آن را کنترل کرد.

متدهای جنریک

شما با استفاده از مفهوم جنریک در جاوا می توانید یک متد جنریک تعریف کنید که آرگومان های آن می تواند از انواع مختلف داده ها باشد. با توجه به نوع داده ای که شما به عنوان پارامترهای متد ارسال می کنید در هر بار فراخوانی کامپایلر نوع داده ارسالی را تشخیص می دهد و با توجه به آن عمل می کند. قوانین تعریف متدهای جنریک به شرح زیر است:

  • همه ی متدهای جنریک یک نوع داده برای پارامتر دارند که هنگام تعریف به جای این که از انواع داده که قبلا گفتیم استفاده کنند از یک شاخص بین دو کاراکتر <> استفاده می شود و اگر قرار باشد که متدی یک مقدار جنریک برگرداند از همین شاخص به جای انواع داده قبلی استفاده خواهد شد. همچنین برای این که بخواهیم نوع داده پارامتر ها هم جنریک باشد به جای استفاده از انوع داده اولیه از شاخص ها استفاده می کنیم.
  • به شاخصی که به جای نوع داده اصلی قرار می دهیم پارامتر نوع گفته می شود و اگر قرار باشد که از دو نوع داده جدا از هم در برنامه استفاده شود باید از چند پارامتر نوع متفاوت استفاده کرد که آنها را با استفاده از , جدا می کنیم.
  • بدنه یک متد جنریک مانند بدنه بقیه متدها می باشد فقط به جای استفاده از نوع داده ای که قبلا از آن استفاده می شد از پارامتر نوع استفاده می کنیم.

مثال زیر مشخص می کند که چگونه می توانیم یک آرایه از داده های مختلف را در خورجی چاپ کنیم.

public class GenericMethodTest
{
   // generic method printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // Display array elements              
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }

    public static void main( String args[] )
    {
        // Create arrays of Integer, Double and Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

        System.out.println( "Array integerArray contains:" );
        printArray( intArray  ); // pass an Integer array

        System.out.println( "\nArray doubleArray contains:" );
        printArray( doubleArray ); // pass a Double array

        System.out.println( "\nArray characterArray contains:" );
        printArray( charArray ); // pass a Character array
    } 
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Array integerArray contains:
1 2 3 4 5 6

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

در مثال بالا حرف E یک پارامتر نوع می باشد که به هنگام استفاده می توان از انواع داده مختلفی به جای این پارامتر نوع استفاده کرد.

محدود کردن پارامترهای نوع

ممکن است اوقاتی پیش بیاید که بخواهیم پارامترهای نوع را محدود تر کنیم تا در اجرا متد ها و کدهایمان به مشکل برنخوریم. در این صورت پارامتر نوع باید به گونه ای باشد که در حین فراخوانی اگر نوع داده مورد نظر شروط مورد نظر را نداشته باشد اجازه اجرا به برنامه ندهد. برای مثال ممکن است که یک متد فقط روی اعداد کار کند. بنابراین نوع داده ای که باید به متد داده شود یا باید از کلاس Number باشد و یا یکی از زیرکلاس های آن باشد. برای انجام این کار باید ابتدا نام خود پارامتر نوع را بیاوریم و بعد از آن کلمه کلیدی Extends و بعد از آن نام کلاس پدر را بیاوریم. برای محدود کردن پارامترهای نوع می توان از کلمات کلیدی extends , implements استفاده کرد. برای مثال به کد زیر دقت کنید. این مثال بین 3 شئ بزرگترین آنها را برمی گرداند.

public class MaximumTest
{
   // determines the largest of three Comparable objects
   public static <T extends Comparable<T>> T maximum(T x, T y, T z)
   {                      
      T max = x; // assume x is initially the largest       
      if ( y.compareTo( max ) > 0 ){
         max = y; // y is the largest so far
      }
      if ( z.compareTo( max ) > 0 ){
         max = z; // z is the largest now                 
      }
      return max; // returns the largest object   
   }
   public static void main( String args[] )
   {
      System.out.printf( "Max of %d, %d and %d is %d\n\n", 
                   3, 4, 5, maximum( 3, 4, 5 ) );

      System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f\n\n",
                   6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );

      System.out.printf( "Max of %s, %s and %s is %s\n","pear",
         "apple", "orange", maximum( "pear", "apple", "orange" ) );
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

maximum of 3, 4 and 5 is 5

maximum of 6.6, 8.8 and 7.7 is 8.8

maximum of pear, apple and orange is pear

کلاس های جنریک

تعریف یک کلاس جنریک بسیار شبیه به تعریف یک کلاس معمولی است. تنها تفاوت آن این است که بعد از نام کلاس پارامترهای نوع بین <> خواهد آمد. اگر بیش از یک پارامتر نوع داشته باشیم باید آنها را با استفاده کاما (,) جدا کنیم. برای مثال به کد زیر توجه کنید که چگونه یک کلاس جنریک تعریف کرده ایم:

public class Box<T> {

  private T t;

  public void add(T t) {
    this.t = t;
  }

  public T get() {
    return t;
  }

  public static void main(String[] args) {
     Box<Integer> integerBox = new Box<Integer>();
     Box<String> stringBox = new Box<String>();
    
     integerBox.add(new Integer(10));
     stringBox.add(new String("Hello World"));

     System.out.printf("Integer Value :%d\n\n", integerBox.get());
     System.out.printf("String Value :%s\n", stringBox.get());
  }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Integer Value :10
String Value :Hello World

در زبان جاوا از مفهوم جنریک بسیار استفاده شده است. برای مثال برای داده ساختار هایی مانند لیست هاو set ها از این مفهوم استفاده شده است. نکته ای که باید به آن دقت داشته باشید این است که برای این که از کلاس یا متد جنریک استفاده کنیم نمی توانیم انواع داده های اصلی مانند int و یا double را به آن بدهیم و باید کلاس wrapper آنها یعنی Integer و Double را به کلاس جنریک اختصاص می دهیم. همانطور که در مثال های بالا دیدیم.Itpro باشید

نویسنده: مهدی عادلی فر

منبع: جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#مفهوم_جنریک #constraint_ها_در_generic_ها #برنامه_نویسی_جاوا #generic_در_زبان_جاوا #آموزش_برنامه_نویسی_جاوا #آموزش_جاوا #کلاس_های_generic_در_جاوا #متدهای_generic_در_جاوا #دوره_آموزشی_جاوا #جنریک_در_زبان_جاوا
عنوان
1 آموزش جاوا (Java) قسمت 1 : معرفی ، خصوصیات و شروع به کار رایگان
2 آموزش جاوا (Java) قسمت 2 : شی گرایی قسمت یک رایگان
3 آموزش جاوا (Java) قسمت 3: شی گرایی قسمت دو رایگان
4 آموزش جاوا (Java) قسمت 4 : شی گرایی قسمت سه رایگان
5 آموزش جاوا (Java) قسمت 5 : انواع داده رایگان
6 آموزش جاوا (Java) قسمت 6 : انواع متغیر رایگان
7 آموزش جاوا (Java) قسمت 7 : Modifier ها رایگان
8 آموزش جاوا (Java) قسمت 8 : عملگرها قسمت یک رایگان
9 آموزش جاوا (Java) قسمت 9 : عملگرها قسمت دو رایگان
10 آموزش جاوا (Java) قسمت 10 : حلقه های تکرار رایگان
11 آموزش جاوا (Java) قسمت 11 : عبارات شرطی رایگان
12 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
13 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
14 آموزش جاوا (Java) قسمت 14: کلاس Wrapper کاراکترها رایگان
15 آموزش جاوا (Java) قسمت 15 : کلاس String و کار با رشته قسمت یک رایگان
16 آموزش جاوا (Java) قسمت 16 : کلاس String و کار با رشته قسمت دو رایگان
17 آموزش جاوا (Java) قسمت 17 : کلاس String و کار با رشته قسمت سه رایگان
18 آموزش جاوا (Java) قسمت 18 : کلاس String و کار با رشته قسمت چهار رایگان
19 آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer رایگان
20 آموزش جاوا (Java) قسمت 20 : استفاده از آرایه ها رایگان
21 آموزش جاوا (Java) قسمت 21 : آموزش کار با تاریخ رایگان
22 آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression) رایگان
23 آموزش جاوا (Java) قسمت 23 : تعریف و استفاده از متدها قسمت یک رایگان
24 آموزش جاوا (Java) قسمت 24 : تعریف و استفاده از متدها قسمت دو رایگان
25 آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها رایگان
26 آموزش جاوا (Java) قسمت 26 : کار با دایرکتوری ها رایگان
27 آموزش جاوا (Java) قسمت 27 : کلاس ByteArrayInputStream رایگان
28 آموزش جاوا (Java) قسمت 28 : معرفی کلاس File و متدها رایگان
29 آموزش جاوا (Java) قسمت 29 : معرفی و شرح Exception ها قسمت 1 رایگان
30 آموزش جاوا (Java) قسمت 30 : معرفی و شرح Exception ها قسمت 2 رایگان
31 آموزش جاوا (Java) قسمت 31 : معرفی و شرح Exception ها قسمت 3 رایگان
32 آموزش جاوا (Java) قسمت 32 : استفاده از انوع کلاس های داخلی رایگان
33 آموزش جاوا (Java) قسمت 33 : وراثت کلاس ها و انواع آن رایگان
34 آموزش جاوا (Java) قسمت 34 : Override کردن متد ها رایگان
35 آموزش جاوا (Java) قسمت 35 : چند ریختی (Polymorphism) رایگان
36 آموزش جاوا (Java) قسمت 36 : Enum و ویژگی های آن رایگان
37 آموزش جاوا (Java) قسمت 37 : معرفی Abstract رایگان
38 آموزش جاوا (Java) قسمت 38 : استفاده از کپسول بندی (Encapsulation) رایگان
39 آموزش جاوا (Java) قسمت 39 : استفاده از اینترفیس ها رایگان
40 آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده رایگان
41 آموزش جاوا (Java) قسمت 41 : معرفی داده ساختارها Enumeration رایگان
42 آموزش جاوا (Java) قسمت 42 : داده ساختار BitSet رایگان
43 آموزش جاوا (Java) قسمت 43 : داده ساختار Vector رایگان
44 آموزش جاوا (Java) قسمت 44 : داده ساختار Stack (پشته) رایگان
45 آموزش جاوا (Java) قسمت 45 : داده ساختار Dictionary رایگان
46 آموزش جاوا (Java) قسمت 46 : داده ساختار Hashtable رایگان
47 آموزش جاوا (Java) قسمت 47 : داده ساختار Properites رایگان
48 آموزش جاوا (Java) قسمت 48 : معرفی و آموزش جنریک (Generic) رایگان
49 آموزش جاوا (Java) قسمت 49 : برنامه نویسی سوکت و شبکه قسمت 1 رایگان
50 آموزش جاوا (Java) قسمت 50 : برنامه نویسی سوکت و شبکه قسمت 2 رایگان
51 آموزش جاوا (Java) قسمت 51 : استفاده از Lambda Expression رایگان
52 آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading رایگان
53 آموزش جاوا (Java) قسمت 53 : Runnable در Thread و Multi-Threading رایگان
54 آموزش جاوا (Java) قسمت 54 : کلاس Thread و متدها رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....