بنام خدا .
در این جلسه از سری مباحث آموزش جاوا پیشرفته میپردازیم به مبحث پرکاربرد generics در جاوا .
اگه بخوام در چند جمله کاربرد generic ها روم توضیح بدم باید بگم یک نوع پیاده سازی یک کلاس و یا یک متد با انواع ورودی و خروجی مختلف و تعیین شده در زمان فراخوانی هست . یعنی راه حلی هست که شما از طریق اون میتونید نوع برگشتی و یا پارامترهای ورودی متد رو تعیین نکنید و اون رو بسپرید به زمان فراخوانی .
مثلا شما میتونید یک متد تعریف کنید که یک لیست رو دریافت کنه و اون رو مرتب کنه و برگردونه فارغ از اینکه عناصر اون لیست چه نوعی دارن . در زمان فراخوانی میتونید اون رو مثلا بایک لیست نوع رشته یا Integer فراخوانی کنید .
متدهای Generic
برای ساخت یک متد generic باید موراد زیر رو در نظر بگیریم .:
- هر متد generic یک بخش پارامتر نوع داره که با دو علامت <> محصور شده و داخلش میتونیم تعداد این پارامترها رو با کاما از هم جدا کنیم .
- بخش نوع پارامتر برگشتی که اون هم بین <> محصور هست
- نوع پارامتر ها فقط میتونن از نوع ارجاع باشن و نمحیتونن از انواع اولیه مثل int باشن.
یک مثال از تعریف متد generic :
package genericmethod;
public class GenericMethod
{
//یک متد بانوع ورودی آرایه ای از هرنوع و خروجی
public static < E > void printArray( E[] inputArray )
{
//داخل متد عناصر ارایه رو چاپ میکنیم
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] )
{
//تعریف سه آرایه از انواع موجود در جاوا برای استفاده در متد جنریک
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( "نتجیه استفاده برای آرایه نوع Integer:" );
printArray( intArray ); // pass an Integer array
System.out.println( "\nنتیجه متد برای آرایه نوع ِ Double:" );
printArray( doubleArray ); // pass a Double array
System.out.println( "\n نتیجه متد برای ارایه نوع کاراکتری:" );
printArray( charArray ); // pass a Character array
}
}
نتیجه اجرای کد بالا :
نتجیه استفاده برای آرایه نوع Integer:
1 2 3 4 5
نتیجه متد برای آرایه نوع ِ Double:
1.1 2.2 3.3 4.4
نتیجه متد برای ارایه نوع کاراکتری:
H E L L O
ملاحظه میکنید که متد رو برای انواع Integer و Double و Chrarcter راخوانی کردیم ...
میتونیم انواع قابل پذیرش برای متد یا کلاس رو محدود کنیم مثلا میتونیم که مقادیر فقط عددی باشن یا اینکه از نوع قابل مقایسه باشن :
package genericmethod;
public class GenericMethod
{
// فقط اجازه انواعی رو که قابل مقایسه هستن رو میده
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","php",
"java", "javascript", maximum( "php", "java", "javascript" ) );
}
}
نتیجه اجرای کد بالا :»
Max of 3, 4 and 5 is 5
Maxm of 6.6,8.8 and 7.7 is 8.8
Max of php, java and javascript is php
ملاحظه میکنید که در هنگام تعریف متد تعیین بزرگترین مقدا با بلاک <T extends Comparable<T>> در واقع به کامپایلرگفتیم فقط انواعی رو که قابل مقایسه هستن قبول کن .
کلاسهای Generic :
تعریف کلاس از نوع generic بسیار ساده هست . مفهوم کلاس نوع generic این هست که ما نوع یا انواعی رو در زمان فراخوانی کلاس بهش ارسال کنیم که داخل کلاس ازش استفاده بشه و به این ترتیب کلاسی داریم که توی بدنش یک نوع دینامیک هست یعنی یک کلاس با بدنه ای که میتونه انواع مختلف و عکس العمل های مختلفی داشته باشه .
public class Box<T> {
//استفاده از نوع پارامتر پویا T
private T 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