[Java] รู้จัก Generic Type ในการเขียนโปรแกรม
Generic หรือ template สำหรับการเขียนโปรแกรมนั้น มีให้เห็นกันได้บ่อยๆ บางคนเคยใช้ และใช้เป็น แต่อาจจะไม่รู้ชื่อเรียกของมัน
Generic เป็นการระบุ Data type ของตัวแปรที่จะใช้ใน Class หรือ Method นั้นๆ ให้มีลักษณะ dynamic ตามการเรียกใช้งาน หรือจะพูดง่ายๆ การทำงานมันก็เหมือนกับ Function Overloading นั่นแหละ หรือ อาจจะประยุกต์เอา operator
เวลาเราเขียน
สมมติว่าผมสร้าง ArrayList ซึ่งเป็นคลาสที่ถูกเขียนด้วย Generic ขึ้นมาด้วยการใช้ Code completion(Ctrl+Space) มันจะเป็นลักษณะนี้ครับ
K - Key
N - Number
T - Type
V - Value
อ้อ ลืมบอกไปว่า รู้สึกเขาจะเรียก <> นี้ว่า Diamond นะครับ แต่ผมไม่ค่อยชินเท่าไร (เหมารวมเป็นคำว่า generic หมด แหะๆ)
http://docs.oracle.com/javase/tutorial/java/generics/types.html
Generic เป็นการระบุ Data type ของตัวแปรที่จะใช้ใน Class หรือ Method นั้นๆ ให้มีลักษณะ dynamic ตามการเรียกใช้งาน หรือจะพูดง่ายๆ การทำงานมันก็เหมือนกับ Function Overloading นั่นแหละ หรือ อาจจะประยุกต์เอา operator
instanceof
มาใช้กับ Generic ให้ความสามารถเหมือน Function Overloading เด๊ะๆ ก็ทำได้..เวลาเราเขียน
List
ถ้าใช้ editor เก่งๆ หน่อย (ผมใช้ eclipse) ก็จะสังเกตได้จาก warning ที่จะคอยเตือนเราว่า Infer Generic..... ถ้าเราไม่ใส่โปรแกรมก็ทำงานได้ ไม่ผิด แต่ถ้าเราอยากจะใช้ List
ที่มีสมาชิกเป็นได้แค่ชนิดตัวแปรที่เรากำหนด เช่น อยากให้เป็น List
ของ String
เท่านั้น Generic นี่แหละ ช่วยคุณได้ !!สมมติว่าผมสร้าง ArrayList ซึ่งเป็นคลาสที่ถูกเขียนด้วย Generic ขึ้นมาด้วยการใช้ Code completion(Ctrl+Space) มันจะเป็นลักษณะนี้ครับ
เราจะเห็นว่ามี
<E>
ที่ขึ้น error ตัวแดงอยู่ เพราะว่ามันไม่รู้ว่า E
ในที่นี้คืออะไรครับ E
ที่ปรากฏอยู่นี้เป็นตัวที่บอกว่าเราจะให้สมาชิก(Element) ของ List เป็นชนิดไหน ถ้าเราต้องการเป็น String
ก็ใส่แทนตัว E
ไปได้เลยครับ แต่ถ้าเป็นได้หลาย datatype ก็ลบ <E>
ออกไปได้เลยครับ
ทีนี้เราก็ใช้งาน Class ที่ถูกเขียนด้วย Generic เป็นแล้ว มาถึงการสร้างบ้าง ก่อนอื่น ต้องทำความเข้าใจกับ วิธีสร้าง Generic Method กันก่อน
จะเห็นว่า เราสามารถส่ง datatype ชนิดไหนก็ได้ไปยัง
genericMethod()
โดยทุกจุดที่ใช้ตัว T
ก็จะถูกเปลี่ยนไปตามชนิดที่ส่งมาโดยอัตโนมัติ (เจ๋งป้ะล่ะ ^^)
ถ้าอยากลองเขียน Generic Class ขึ้นมาใช้เองบ้าง ก็คล้ายๆกันครับ ต่างกันนิดเดียวตรงที่ เราจะแปะ
<>
ไว้ด้านหลังชื่อ แทนที่จะแปะไว้ด้านหน้า return type แบบ method
ทีนี้ ได้เวลาคลายความสงสัยว่า ไอ้
E
, T
ที่ผมใช้เนี่ย มันคืออะไร ผมจะบอกครับว่า จริงๆ มันเป็นอะไรก็ได้ พิมพ์เป็นตัวมั่วๆก็ใช้ได้ เพราะมันเป็นตัวแทนชนิดตัวแปรจริงๆ เฉยๆ ดังนั้นจึงมีการกำหนดขึ้นมาว่า ให้ใช้ตัวอักษรเหล่านี้ เพื่อแทนสิ่งที่มันจะเป็น เช่น Generic ของ List
ก็จะใช้ตัว E
แทน สมาชิก(Element), Generic ของ Map
ก็จะใช้ K
กับ V
แทน คีย์(Key) กับ ค่า(Value) และที่ผมใช้ในตัวอย่างคือ T
มาจาก Type ซึ่งหมายถึงชนิดข้อมูล ถ้าไม่รู้จะใช้อะไรก็ T
เนี่ยแหละครับ
อันนี้เป็นข้อมูลจากเว็บของ Oracle นะครับ
E - Element (used extensively by the Java Collections Framework)K - Key
N - Number
T - Type
V - Value
อ้อ ลืมบอกไปว่า รู้สึกเขาจะเรียก <> นี้ว่า Diamond นะครับ แต่ผมไม่ค่อยชินเท่าไร (เหมารวมเป็นคำว่า generic หมด แหะๆ)
http://docs.oracle.com/javase/tutorial/java/generics/types.html