วิธีใช้คีย์เวิร์ด this ใน Java
เมื่อเริ่มเขียน Java คุณจะสังเกตเห็นคีย์เวิร์ด this ใช้ในเมธอดหรือคอนสตรักเตอร์ this หมายถึงออบเจ็กต์ปัจจุบัน (current object) ภายในเมธอดหรือคอนสตรักเตอร์ มีหลายกรณีการใช้งาน
บทช่วยสอนนี้จะอธิบายคีย์เวิร์ด this ว่าเป็นอะไร ทำไมถึงใช้ และใช้อย่างไร พร้อมตัวอย่างแสดงการทำงาน
เมธอดและคอนสตรักเตอร์ใน Java
เมธอดและคอนสตรักเตอร์เป็นส่วนสำคัญของการเขียน Java
เมธอด (Methods) หรือฟังก์ชัน ใน OOP คือบล็อกโค้ดที่ทำหน้าที่เฉพาะเจาะจง เช่น พิมพ์เนื้อหาอาร์เรย์ หรือรับอินพุตจากผู้ใช้
ตัวอย่างเมธอดพิมพ์ "It's Monday!":
public class PrintMessage {
public static void main(String[] args) {
System.out.println("It's Monday!");
}
}
คอนสตรักเตอร์ (Constructors) คล้ายเมธอด แต่ถูกเรียกเมื่อสร้างออบเจ็กต์ (instantiate) ใช้ตั้งค่าเริ่มต้น
ตัวอย่างคอนสตรักเตอร์ตั้งค่า day = "Monday":
class Monday {
String day;
Monday() {
day = "Monday";
}
public static void main(String[] args) {
Monday day_of_the_week = new Monday();
System.out.println("It's " + day_of_the_week.day);
}
}
คีย์เวิร์ด this ใน Java
this หมายถึงออบเจ็กต์ปัจจุบันภายในเมธอดหรือคอนสตรักเตอร์
ตัวอย่างแสดงค่า this และออบเจ็กต์ที่สร้าง:
class Monday {
private String day;
private Monday() {
day = "Monday";
System.out.println(this);
}
public static void main(String[] args) {
Monday day_of_the_week = new Monday();
System.out.println("It's " + day_of_the_week.day);
System.out.println(day_of_the_week);
}
}
ผลลัพธ์:
Main@d716361 It's Monday Main@d716361
ค่า this (บรรทัดแรก) และออบเจ็กต์ day_of_the_week (บรรทัดสุดท้าย) เหมือนกัน แสดงว่า this อ้างอิงถึงออบเจ็กต์ปัจจุบัน
กรณีการใช้ this
มี 2 สถานการณ์หลักที่ this มีประโยชน์:
- ใช้
thisเพื่อแยกแยะชื่อตัวแปร (disambiguate variable names) - ส่ง
thisเป็นอาร์กิวเมนต์ (passing this as an argument)
รูปแบบ this() ใช้ใน constructor overloading ซึ่งเป็นหัวข้อขั้นสูง จะไม่กล่าวถึงในบทนี้
1. ใช้ this แยกแยะชื่อตัวแปร
ใน Java ไม่สามารถประกาศตัวแปร 2 ตัวขึ้นไปชื่อเดียวกันใน scope เดียวกันได้ จะส่งผลต่อตรรกะโปรแกรม
แต่สามารถแก้ได้ด้วย this - ใช้กำหนดให้ตัวแปรใดเป็นของออบเจ็กต์ ทำให้เก็บค่าทั้งพารามิเตอร์และตัวแปร instance ได้พร้อมกัน
ตัวอย่าง: โปรแกรมบันทึกชื่อนักเรียนที่ได้รับเกียรติยศ ระดับชั้นมัธยมต้น ต้องพิมพ์ชื่อออกมา
class HonorRoll {
String studentName;
HonorRoll(String studentName) {
this.studentName = studentName;
}
public static void main(String[] args) {
HonorRoll alex = new HonorRoll("Alex");
System.out.println("New honor roll inductee: " + alex.studentName);
}
}
ผลลัพธ์: New honor roll inductee: Alex
ใช้ this.studentName = studentName กำหนดค่าพารามิเตอร์ให้ตัวแปร instance ถ้าไม่ใช้ this จะได้ null เพราะคอมไพเลอร์ไม่รู้ว่าตัวแปรไหนคือตัวไหน
2. ส่ง this เป็นอาร์กิวเมนต์
this มักใช้ส่งออบเจ็กต์ปัจจุบันไปยังเมธอดอื่น
ตัวอย่าง: แอปติดตามจำนวนถุงกาแฟในสต็อกร้านกาแฟ ให้เจ้าของเพิ่มสต็อกเมื่อมีสินค้าเข้าใหม่
class AddStock {
int stockToAdd;
int stockTotal;
AddStock(int stockToAdd, int stockTotal) {
this.stockToAdd = stockToAdd;
this.stockTotal = stockTotal;
System.out.println("Current stock: " + this.stockTotal);
calculateNewStock(this);
System.out.println("New stock: " + this.stockTotal);
}
void calculateNewStock(AddStock s) {
s.stockTotal += s.stockToAdd;
}
}
class Main {
public static void main(String[] args) {
AddStock newStockValue = new AddStock(10, 9);
}
}
ผลลัพธ์:
Current stock: 9 New stock: 19
อธิบาย: คลาส AddStock มีคอนสตรักเตอร์รับ 2 ค่า เรียก calculateNewStock() คำนวณสต็อกใหม่ ใน main สร้างอินสแตนซ์ส่งค่า 10 และ 9 โปรแกรมบวกค่าทั้งสอง พิมพ์สต็อกเดิมและใหม่
this ถูกส่งเป็นอาร์กิวเมนต์เมื่อเรียก calculateNewStock(this) ทำให้เมธอดนั้นเข้าถึงตัวแปรใน AddStock ได้
สรุป
คีย์เวิร์ด this ใน Java หมายถึงออบเจ็กต์ปัจจุบันในเมธอดหรือคอนสตรักเตอร์ มี 2 การใช้งานหลัก:
- แยกแยะชื่อตัวแปร (disambiguate variable names)
- ส่ง this เป็นอาร์กิวเมนต์ให้เมธอดอื่น
บทช่วยสอนนี้อธิบายการใช้งานทั้ง 2 กรณีพร้อมตัวอย่าง ตอนนี้คุณพร้อมใช้ this ใน Java อย่างมืออาชีพแล้ว!