Tuesday, January 6, 2015

Java กับ Generic method

เมื่อเราต้องการเขียนโปรแกรมให้สนับสนุนข้อมูลหลายๆประเภท เช่น เขียน method เดียวแต่รองรับทั้งข้อมูลที่เป็น integer และ String เราอาจจะคิดถึง Overloaded methods ซึ่งก็ต้องเขียน method แยกไปแต่ละประเภทของข้อมูล

อย่างไรก็ตาม หากเราต้องการเขียนเป็น method เดียว เพื่อให้โปรแกรมกระชับและมีประสิทธิภาพ รวมถึงตัว compiler สามารถตรวจสอบความถูกต้องของชนิดของข้อมูลให้ได้ วิธีการนึงคือการใช้งาน Generic method ซึ่งเริ่มมีมาตั้งแต่ Java รุ่น 5.0 ไปครับ

ลองดูตัวอย่างการเขียนโปรแกรมโดยใช้ method ปกติ เพื่อแสดงค่าของสมาชิกของตัวแปรชุด (Array)

//======= Normal method to print an integer array ==========
public class MyArray{
    public void printArray(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }        
    }
    
    public static void main(String[] args){
        MyArray m = new MyArray();
        int[] a = {1,2,3};
        m.printArray(a);
    }
}
จะเห็นว่า method ชื่อ printArray() ก็จะใช้ได้เฉพาะ array แบบ integer เท่านั้น ถ้าต้องการใช้กับข้อมูลประเภทอื่น ก็ต้องเขียน method นี้ใหม่

คราวนี้ลองมาเปลี่ยน method นี้ให้เป็น generic method กันดูครับ

//======= Generic method to print any array ==========
public class MyArray{
    public <E> void printArray(E[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }        
    }
    
    public static void main(String[] args){
        MyArray m = new MyArray();
        //int[] a = {1,2,3};
        //must create array object to be compatible with generic type
        Integer[] a = {1,2,3};
        String[] b = {"I","love","you"};    
        m.printArray(a);
        m.printArray(b);
    }
}
ก็จะเห็นว่า method ใหม่นี้รองรับทั้ง array หลายชนิด ทั้งแบบ Integer และ String ตามตัวอย่าง

ข้อสังเกตการสร้างและใช้งาน generic method คือ

  1. Generic method มี <Eหน้า return type ซึ่งสัญลักษณ์พิเศษนี้ก็คือตัวแทนของชนิดของข้อมูล นั่นคือ E ในที่นี้อาจจะแทน Integer, String, Double ฯลฯ (เป็น reference type ไม่ใช่ primitive type เช่น int, double, char)
  2. เราสามารถใช้ตัวอักษรอื่นแทน E ก็ได้ ซึ่งปกติจะมีรูปแบบแนะนำว่าควรใช้ตัวอักษรแบบไหนเพื่ออะไร เช่น E แทน Elements หรือ T แทน Types ดูเพิ่มเติมได้ที่นี่ครับ
  3. การใช้งานตัว E ใน method ก็เหมือนชนิดของข้อมูลทั่วไป เช่น เอาไว้หน้าตัวแปร
ข้อมูลอ้างอิง
http://www.tutorialspoint.com/java/java_generics.htm
http://docs.oracle.com/javase/tutorial/java/generics/

No comments:

Post a Comment