การใช้ this จัดทำโดย : Mr.POP พิมพ์
 Untitled Document

สวัสดีครับ ในบทความนี้เรายังคงศึกษาเรื่องความหมายของ keyword ในภาษา Java กันอีกหนึ่งตัวนะครับ คราวนี้ผมจะขอนำเสนอเรื่องของ this ครับ มาดูว่า this นั้นมีความสำคัญอย่างไรและมีการใช้งานยังไงกันเลยครับ

ความหมายของ this
อย่างที่เราทราบกันดีแล้วว่าเราสามารถสร้าง instance จากคลาสใดๆ ได้เพื่อนำมาใช้ในการอ้างถึงสมาชิกและ Method ในคลาสนั้นๆ แต่ในกรณีที่ไม่มีการสร้าง instance ขึ้นมา ภาษา Java ยังมี keyword ชื่อ this เพื่อใช้ในการเรียกสมาชิกภายในคลาสได้ทันทีโดยไม่ต้องมีประโยคประกาศใดๆ แต่ this นี้จะใช้ได้ภายในคลาสของตัวเิองเท่านั้นซึ่ง this นี้ก็เปรียบเหมือนเป็น instance ของคลาสนั้นๆ นั่นเอง

ประโยชน์ของ this แบบที่ 1 คือ จะใช้ในการอ้างถึงชื่อสมาชิกในคลาสนั้นเพื่อให้แตกต่างจากชื่ออื่น เนื่องจากสมาชิกของคลาสอาจมีชื่อเหมือนกับชื่อพารามิเตอร์ของบาง Method ในคลาส หรือมีชื่อเหมือนกับสมาชิกในคลาสอื่นที่ถูกอ้างถึงในคลาสนั้น เราลองมาดูตัวอย่างต่อไปนี้กันเลยครับ

อธิบายโปรแกรม ผมให้สังเกตที่คลาส Num นะครับ มีการประกาศตัวแปร x กับ y เป็น double และที่ Constructor ของ Num มีการรับพารามิเตอร์ 2 ตัวโดยใช้ชื่อ x กับ y เหมือนกัน และ this.x = x จะหมายถึง การนำค่าพารามิเตอร์ของ Mthod คือ x ไป กำหนดให้กับตัวแปรของคลาสนี้ คือตัวแปร x และ this.y = y จะหมายถึง การนำค่าพารามิเตอร์ของ Mthod คือ y ไปกำหนดให้กับตัวแปรของคลาสนี้ คือตัวแปร y ถ้าเราเขียนประโยคเป็น x = x โดยที่ไม่มี this มาอ้างนั้นจะทำให้การกำหนดค่าไปเป็นผล เพราะประโยค x = x นั้นจะหมายถึงการกำหนดค่าพารามิเตอร์ให้กับตัวเองนั่นเอง จะเห็นว่า this จะเป็น instance ให้กับคลาส Num โดยใช้ในการอ้างถึงตัวแปร x กับ y ที่ประกาศเป็นตัวแปรอยู่ในของคลาสนี้เท่านั้นลองดูภาพประกอบด้่านล่างนะครับ

ต่อจากนั้นให้เราลองกลับไปดู Mthod อีก 2 ตัวที่เหลือในคลาส Num คือ add กับ print ใน add นั้นมีการเรียกใช้ตัวแปร x กับ y ของคลาสนี้ ซึ่งไม่จำเป็นต้องใช้ this มาอ้างเพราะ x กับ y ที่เขียนอยู่ใน Method นี้จะหมายถึง x กับ y ในคลาสนี้อยู่แล้วในกรณีของ print ก็เหมือนกันนะครับ ลองดูให้ดีอย่าสับสนนะครับ

ประโยชน์ของ this แบบที่ 2 คือ จะใช้ในการส่ง instance ของตัวเองไปให้กับ instance หนึ่งเพื่อให้ instance นั้นอ้างถึงหรือเรียกกลับมาที่ตัวเองอีกครั้งหนึ่ง จะเรียกวิธีการแบบนี้ว่าการ "Call Back" ดูตัวอย่างต่อไปนี้ครับ

อธิบายโปรแกรม ผลลัพธ์ของโปรแกรมนี้คือ พิมพ์คำว่า "Hello Webthaidd!" ออกมาแค่นั้นแหละครับ แต่วิธีการนี่ซิครับเข้าใจได้ยากพอสมควร ลองมาดูที่คลาส One นะครับ Mthod f(Two b) นี่รับพารามิเตอร์เป็นแบบ pass by reference โดยจะเป็น instance ของคลาส Two นั่นเอง ภายในมี b.h(this) อันนี้คือการอ้างถึง h ของ Two พร้อมส่ง this ไปให้ h ด้วย this ที่ส่งไปนี้ก็คือ instance ของคลาส One ครับ ส่งไปเพื่อให้ Mthod h(One a) ในคลาส Two ซึ่งมันรอรับพารามิเตอร์เป็น insatnce ของคลาส One นั้นเรียกกลับมาที่ Mthod g() ที่อยู่ในคลาส One อีกครั้งหนึ่งจากประโยค a.g() ; ลองทำความเข้าใจดูนะครับ

จากตัวอย่างเราสามารถใช้วิธีการอีกแบบนึงก็ได้ครับถ้าเราเข้าใจสถานะของ this จริงๆ อย่างที่บอกไว้ครับว่า this คือ instance ของคลาสนั้นๆ จากบรรทัดที่ 2 ประโยค b.h(this) ถ้าเราเปลี่ยน this เป็น b.h(new One()) ก็จะได้ผลลัพธ์เหมือนกันเลยครับ เพราะว่า new One() ก็คือ การสร้าง instance ของคลาส One นั่นแหละครับ แต่ไม่นิยมใช้วิธีนี้ครับผมยกตัวอย่างมาให้ดูกันเฉยๆ จะนิยมใช้ this มากกว่า

ประโยชน์ของ this แบบที่ 3 คือใช้ในการเรียก Constructor ในคลาสของตัวเอง ดูตัวอย่างต่อไปนี้ครับ

อธิบายโปรแกรม ผมขอยกตัวอย่างแรกจากคลาส Num มาอธิบายอีกทีนะครับโดยให้เพิ่มตรงบรรทัดที่ 4
Num( ) { this(0.0,0.0) ; }
จะเห็นว่าคลาสนี้จะมี Constructor 2 ตัว แต่ Num() นั้นจะใช้ this แล้วส่ง Argument ไปสองตัว คือ 0.0 ซึ่ง this ในที่นี้ก็คือการเรียก Constructor ของคลาสตัวเองนั่นเอง โดยค่าของ Argument ที่ส่งไปนั้นคอมไพเลอร์จะเป็นผู้ที่เลือกให้เองว่าจะไปใช้ Constructor ตัวไหนจากในตัวอย่างนี้ถ้าเราสร้าง instance ดังนี้
Num N = new Num() ;
จะได้ว่าค่าเริ่มต้นของ x กับ y จะเป็น 0.0 ทั้งคู่เนื่องจากที่ Num() ใช้ this ไปเรียก Num(double x,double y) พร้อมส่งค่า 0.0 ไปกำหนดให้กับตัวแปร x กับ y ของคลาสนั่นเอง แต่การใช้ this เรียก Constructor นั้นจะทำได้เฉพาะภายใน Constructor เท่านั้นจะไปเรียกนอก Constructor ไม่ได้

สำหรับบทความนี้ก็ยังคุยกันในเรื่องของ keyword อีกตัวหนึ่งใน Java นะคับ keyword เหล่านี้เราไม่ควรมองข้ามไปนะครับถ้ารักจะเขียน Java เพราะมันจะนำไปใช้ประโยชน์ได้หลากหลาย ผมขอจบไว้แค่นี้นะครับเจอกันบทความหน้าครับ สวัสดีครับ...

 

คุณอาจสนใจ
การใช้ฟังก์ชัน count
nut (125,267 - 02 ก.ค. 49)
แก้ปัญหา run ภาษาไทย ของ tis620 บน utf-8 ไม่ได้
Tung (44,371 - 19 ธ.ค. 50)
เจาะลึกการใช้ Symbolism Tool และ Data Driven Graphic กับงานพิมพ์ และงานเว็บ (ตอนจบ)
ธนิศา ไชยภูริพัฒน์ (32,441 - 19 ม.ค. 51)
การตั้งค่าหน้ากระดาษ
นายนุก (28,916 - 07 ก.พ. 51)
การทำ Gradient ภาพโดยใช้ Dream
Mr.GuruZ (53,270 - 04 มิ.ย. 49)
สร้างข้อความเนยแข็ง
langjuko (142,562 - 28 ต.ค. 51)
การแทรก FlashButton ลงในเว็บเพจ
Baddevil (26,741 - 26 พ.ย. 50)
เคล็ดไม่ลับกับการแทรกโค้ด PHP ลงใน Dream
Mr.GuruZ (50,525 - 04 มิ.ย. 49)