เมทอด: วิธีเขียน
แนะนำใหม่| English | ความหมาย |
|---|---|
| accessor/əkˈsesə/ | เมธอดเข้าถึง |
| mutator/mjuːˈteɪtə/ | เมธอดแก้ไขค่า |
การอัปเดตที่ปฏิเสธไว้ทำให้สถานะก่อนหน้าคงอยู่
- คะแนนเริ่มต้นที่ 20. setScore(s) จะกำหนดค่าก็ต่อเมื่อ s >= 0; การเรียกใช้ setScore(-5) ทำให้คะแนนคงอยู่ที่ 20.
- การตรวจสอบก่อนทำงาน (guard) ป้องกันการอัปเดตที่ไม่ถูกต้อง การเรียกใช้ getScore() ในภายหลังจะคืนค่าสถานะเดิมแทนที่จะเป็นพารามิเตอร์ที่ถูกปฏิเสธ
การเขียนเมทโอด
- เมทดอด มี เฮดเดอร์ และ บอดี้ เฮดเดอร์:
public void addScore(int s)— การเข้าถึง, ประเภทของค่าที่ส่งกลับ, ชื่อ, พารามิเตอร์ - บอดี้: คำสั่งใน
{ }ที่ทำหน้าที่จริง เมทดอดสามารถอ่านและแก้ไขตัวแปรinstance ของออบเจ็กต์ได้
การส่งค่ากลับ (Return values)
- ประเภทของค่าที่ส่งกลับ (return type) ของเมทดอดระบุว่ามันจะส่งอะไรกลับมา; ใช้
return value;เพื่อส่งค่ากลับpublic int getScore() { return score; }จะคืนคะแนนปัจจุบัน - เมทดอด
voidส่งคืน ไม่มีอะไร — มันเพียงแต่ทำงานให้เสร็จ (เช่น การพิมพ์) ค่าที่ส่งกลับต้องเข้ากันได้กับประเภทที่ประกาศไว้; ตัวอย่างเช่น ค่าintสามารถขยายขนาดและถูกส่งคืนโดยเมทดอดdoubleได้
method public double result() { return 3; } สามารถ compile ได้แม้ว่า 3 จะเป็น int literal
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Java ขยายผลลัพธ์ int เป็น double; ค่าที่ต้อง return ต้องเข้ากันได้กับประเภทของตัวแปรรับ แต่ไม่จำเป็นต้องเขียนด้วย type เดียวกัน
Getter และ Setter
- แอกเซสเซอร์ (getter) ส่งคืนข้อมูลโดยไม่เปลี่ยนออบเจ็กต์:
getScore()มิวนเตตเตอร์ (setter) เปลี่ยนสถานะของออบเจ็กต์:addScore(s)หรือsetName(n) - Getter มักจะเป็นการส่งคืน
int/String; Setter มักจะเป็นvoidรวมกันแล้วพวกมันสร้างอินเทอร์เฟซสาธารณะของออบเจ็กต์เหนือข้อมูลส่วนตัว
Accessor ส่งคืนค่า
เริ่มจากคะแนน 20, setScore(-5) ปฏิเสธการอัปเดต; getScore กลับคืนค่า 20
เมทอดที่ส่งคืนข้อมูลโดยไม่เปลี่ยนวัตถุคือ(a(n))...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Accessors อ่านและส่งคืน; mutators เปลี่ยนสถานะ
เมทอด void...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
void = ไม่มีการส่งคืนค่า; มันแค่ดำเนินการ
A non-void method may reach its closing brace and complete normally without returning a value.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
A path completing normally must return a compatible value. A path that throws an exception is a different case.
เมทอดใดสามารถตรวจสอบอินพุตก่อนเปลี่ยนสถานะได้?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Setter สามารถตรวจสอบ (เช่น ปฏิเสธค่าติดลบ) ก่อนกำหนดค่า
การเขียนส่งคืนค่าภายในメธอด void คอมไพล์ได้ปกติ
Difficulty 1/5 · 100 coins + a small bonus on first completion today
เมทอด void ไม่สามารถส่งคืนค่าได้ — นั่นจะไม่คอมไพล์
เมธอดสามารถตรวจสอบความถูกต้องได้
- เนื่องจากโค้ดภายนอกเข้าถึงผ่านเมทดอด เมทดอดจึงสามารถ ตรวจสอบ ก่อนที่จะกระทำ
public void setScore(int s) { if (s >= 0) score = s; }ปฏิเสธคะแนนที่เป็นลบ - การเข้าถึงแบบส่วนตัว (private access) ป้องกันโค้ดที่ไม่เกี่ยวข้องจากการกำหนดค่าฟิลด์โดยตรง Constructor และเมทดอดทุกตัวที่เขียนค่านี้ต้องรักษากฎที่กำหนดไว้เสมอ; setter ที่มีการป้องกันไม่สามารถซ่อมแซมคะแนนเริ่มต้นที่ไม่ถูกต้องได้ด้วยตัวเอง
Method ที่ไม่ใช่ void ต้องคืนค่า compatible ในทุกเส้นทางที่เสร็จสิ้นปกติ Method บางเส้นทางอาจ抛出 Exception แทน หาก метод int ถึงจุดสิ้นสุดโดยไม่คืนค่า การคอมไพล์จะล้มเหลว Method void ไม่คืนค่าอะไร ดังนั้น return; (หรือไม่มี return statement) จึงถูกต้องสำหรับกรณีนั้น; การเขียน return value; ใน Method void จะไม่คอมไพล์ได้
For the stated guarded setter, what does getScore() return after setScore(-5)?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
The condition fails, so no assignment occurs and the old score remains 20.
เริ่มจากคะแนน 20, replaceScore(30) เก็บคะแนนเก่าไว้, asign 30, แล้วกลับคืนค่าคะแนนเก่า ค่าที่ call นี้จะ return คือเท่าไร?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
คะแนนเก่าที่ถูก return คือ 20; คะแนนใหม่ที่ถูกเก็บไว้คือ 30. การ return ค่าไม่阻止การเปลี่ยนสถานะ (mutation)
Getter และ Setter:
- Getter:
public int getScore() { return score; }— อ่านค่า, ส่งคืนint - Setter:
public void addScore(int s) { score += s; }— เปลี่ยนสถานะ, ส่งคืนไม่มีอะไร student.addScore(10); int now = student.getScore();
ขยายเหตุผลไปยังกรณีใหม่
- พิจารณา
public int replaceScore(int s) { int old = score; score = s; return old; }มันคือ mutator แม้ว่าจะมีค่าคืนกลับ: เริ่มต้นที่ 20, replaceScore(30) จะคืนค่า 20 และเก็บคะแนนไว้ที่ 30 - ตัดสินพฤติกรรมแทนที่จะดูชื่อหรือประเภทการส่งกลับ เมทดอดที่ชื่อว่า getScore แต่เพิ่มคะแนนไม่ใช่แอกเซสเซอร์บริสุทธิ์ และเมทดอดvoid ที่แค่พิมพ์ข้อความไม่จำเป็นต้องมิวนเตตออบเจ็กต์
เมทดอด มี เฮดเดอร์ (การเข้าถึง, ประเภทการส่งกลับ, ชื่อ, พารามิเตอร์) และ บอดี้ เมทดอดที่ไม่ใช่void ต้อง return ค่าที่เข้ากันได้กับ assignment ในทุกเส้นทางที่ทำงานปกติ之路; void เมทดอดส่งคืนไม่มีอะไร แอกเซสเซอร์ (getters) ส่งคืนสถานะโดยไม่เปลี่ยนแปลง; มิวนเตตเตอร์ (setters) เปลี่ยนสถานะและสามารถ ตรวจสอบความถูกต้อง ของค่าใหม่ได้