Methods: Cách Viết Chúng
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| accessor/əkˈsesə/ | phương thức truy cập |
| mutator/mjuːˈteɪtə/ | phương thức thay đổi |
Một bản cập nhật bị từ chối giữ nguyên trạng thái trước đó
- Điểm số bắt đầu ở 20. setScore(s) chỉ gán khi s >= 0; lời gọi setScore(-5) giữ điểm số ở 20.
- Điều kiện bảo vệ ngăn chặn bản cập nhật không hợp lệ. Một lần gọi getScore() sau đó sẽ trả về trạng thái hiện có thay vì đối số bị từ chối.
Viết một method
- Một phương thức có một header và một thân. Header:
public void addScore(int s)— truy cập, kiểu trả về, tên, tham số. - Thân: các câu lệnh trong
{ }thực hiện công việc. Phương thức có thể đọc và thay đổi các biến instance của đối tượng.
Trả về giá trị
- Kiểu trả về của phương thức nói lên những gì nó trả lại; sử dụng
return value;để gửi nó.public int getScore() { return score; }trả về điểm số hiện tại. - Một phương thức
voidtrả về không có gì — nó chỉ làm nhiệm vụ của mình (ví dụ: in ra). Giá trị trả về phải tương thích để gán với kiểu trả về đã khai báo; ví dụ, một giá trịintcó thể được mở rộng và trả lại bởi một phương thứcdouble.
Phương thức public double result() { return 3; } có thể biên dịch được mặc dù 3 là hằng int.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Java mở rộng kết quả int sang double; các giá trị trả về phải tương thích với nhau, không nhất thiết phải được viết bằng đúng một kiểu dữ liệu giống nhau.
Getter và Setter
- Một accessor (getter) trả về thông tin mà không thay đổi đối tượng:
getScore(). Một mutator (setter) thay đổi trạng thái của đối tượng:addScore(s)hoặcsetName(n). - Getter thường trả về
int/String; setter thường làvoid. Cùng nhau, chúng tạo thành giao diện công khai của đối tượng trên dữ liệu riêng tư của nó.
Một accessor trả về một giá trị
Bắt đầu từ score 20, setScore(-5) từ chối cập nhật; getScore trả về 20.
Một phương thức trả về thông tin mà không thay đổi đối tượng là một(n)...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Accessors đọc và trả về; mutators thay đổi state.
Một phương thức void...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
void = không có giá trị trả về; nó chỉ thực hiện một hành động.
A non-void method may reach its closing brace and complete normally without returning a value.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
A path completing normally must return a compatible value. A path that throws an exception is a different case.
Phương thức nào có thể validate input trước khi thay đổi state?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
A setter có thể kiểm tra (ví dụ: từ chối số âm) trước khi gán.
Viết return value; bên trong một void method biên dịch tốt.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Một void method không thể return một giá trị — điều đó sẽ không biên dịch được.
Phương pháp có thể kiểm chứng
- Vì mã bên ngoài phải đi qua các phương thức, một phương thức có thể kiểm tra trước khi thực thi.
public void setScore(int s) { if (s >= 0) score = s; }từ chối điểm số âm. - Truy cập riêng tư ngăn mã không liên quan gán trực tiếp cho trường này. Constructor và mọi phương thức class nào ghi vào đó vẫn phải duy trì quy tắc mong muốn; setter được bảo vệ không thể tự sửa lỗi điểm số ban đầu không hợp lệ.
Một phương thức không phải void phải trả về giá trị tương thích trên mọi đường dẫn hoàn tất bình thường. Một đường dẫn có thể thay thế bằng cách ném ra ngoại lệ. Nếu một phương thức int đạt đến cuối mà không trả về, biên dịch sẽ thất bại. Một phương thức void không trả về gì, do đó return; (hoặc không có return) là chính xác ở đó; viết return value; trong một phương thức void sẽ không biên dịch được.
For the stated guarded setter, what does getScore() return after setScore(-5)?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
The condition fails, so no assignment occurs and the old score remains 20.
Bắt đầu từ score 20, replaceScore(30) lưu điểm cũ, gán 30, sau đó trả về điểm cũ. Calls này sẽ trả về giá trị nào?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Điểm cũ được trả về là 20; điểm mới được lưu trữ là 30. Việc trả về một giá trị không ngăn chặn sự biến đổi.
Một accessor và một mutator:
- Accessor:
public int getScore() { return score; }— đọc, trả vềint. - Mutator:
public void addScore(int s) { score += s; }— thay đổi trạng thái, trả về không có gì. student.addScore(10); int now = student.getScore();
Mở rộng suy luận sang trường hợp mới
- Hãy xem xét
public int replaceScore(int s) { int old = score; score = s; return old; }. Nó là một mutator ngay cả khi nó trả về giá trị: bắt đầu từ 20, replaceScore(30) trả về 20 và để lại điểm số tại 30. - Đánh giá hành vi thay vì tên gọi hay kiểu trả về. Một phương thức tên getScore nhưng tăng điểm số thì không phải là accessor thuần túy, và một phương thức void chỉ in một thông báo cũng không nhất thiết phải làm thay đổi đối tượng.
Một phương thức có header (truy cập, kiểu trả về, tên, tham số) và body. Một phương thức không phải void phải return một giá trị tương thích assignment trên mọi đường dẫn hoàn tất bình thường; một phương thức void không trả về gì. Accessor (getter) trả về trạng thái mà không thay đổi; mutator (setter) thay đổi trạng thái và có thể xác minh giá trị mới.