Chúng tôi tiếp tục giới thiệu về nâng cấp đối tượng trong java trong khoa hoc java này


Nạp chồng phương thức

Khi bạn tạo hai phương thức có cùng tên, nhưng số lượng tham số khác nhau (hoặc kiểu của tham số khác nhau), bạn đã nạp chồng phương thức đó. Đây là một mặt mạnh của đối tượng. Môi trường chạy thi hành của Java sẽ quyết định phiên bản nào của phương thức được gọi, dựa trên những thứ mà bạn truyền vào. Trong trường hợp các hàm tạo của chúng ta, nếu bạn không truyền vào bất cứ tham số nào thì JRE sẽ dùng hàm tạo không tham số. Nếu ta truyền vào hai đối tượng kiểu String thì môi trường chạy thi hành sẽ dùng phiên bản nhận hai tham số String. Nếu ta truyền vào các tham số có kiểu khác (hoặc là chỉ một String) thì môi trường chạy thi hành sẽ nhắc rằng không có hàm tạo nào nhận những tham số kiểu đó.
Bạn có thể nạp chồng bất cứ phương thức nào chứ không phải chỉ hàm tạo, việc này khiến cho việc tạo các giao diện thuận tiện cho người dùng sử dụng lớp của bạn trở nên dễ dàng. Hãy thử bằng cách bổ sung thêm phiên bản khác của phương thức addMoney() của bạn. Lúc này, phương thức đó nhận một tham số kiểu int. Tốt thôi, nhưng điều gì sẽ xảy ra nếu chúng ta muốn nạp thêm 100$ vào quỹ của Adult? Chúng ta phải gọi đi gọi lại phương thức này để thêm vào một loạt tờ giấy bạc có tổng giá trị là 100$. Thật là vô cùng bất tiện. Sẽ hay hơn nhiều nếu có thể truyền vào một mảng các phần tử int biểu thị cho một tập nhiều tờ giấy bạc. Ta hãy nạp chồng phương thức này để nhận tham số là một mảng. Đây là phương thức mà ta có:
PHP:
public void addMoney(int bill) {Integer boxedBill = new Integer(bill);wallet.add(boxedBill);
}
Còn đây là phiên bản nạp chồng:
PHP:
public void addMoney(int[] bills) {
for (
int i 0bills.lengthi++) {int bill bills[i];Integer boxedBill = new Integer(bill);wallet.add(boxedBill);
}
}
Phương thức này trông rất giống với một phương thức addMoney() khác của chúng ta, nhưng nó nhận tham số là một mảng. Ta thử dùng phương thức này bằng cách biến đổi phương thức main() của Adult giống như sau:
PHP:
public static void main(String[] args) {Adult myAdult = new Adult();
 
myAdult.addMoney(new int[] { 1510 });System.out.println(myAdult);
}
Khi chạy mã lệnh này, ta có thể thấy Adult có một wallet bên trong có 16$. Đây là giao diện tốt hơn nhiều. Nhưng chưa xong. Hãy nhớ rằng chúng là lập trình viên chuyên nghiệp, và ta muốn giữ cho mã lệnh của mình được sáng sủa. Bạn có thấy sự trùng lặp mã lệnh nào trong hai phương thức của chúng ta chưa? Hai dòng trong phiên bản đầu tiên xuất hiện nguyên văn trong phiên bản thứ hai. Nếu ta muốn thay đổi những gì ta làm khi thêm tiền vào, ta phải biến đổi mã lệnh ở hai nơi, đó là ý tưởng kém. Nếu ta bổ sung phiên bản khác của phương thức này để nó nhận tham số là ArrayList thay vì nhận một mảng, chúng ta phải biến đổi mã lệnh ở ba nơi. Điều đó nhanh chóng trở nên không thể chấp nhận nổi. Thay vào đó, chúng ta có thể tái cấu trúc (refactor) mã lệnh để loại bỏ sự trùng lặp. Ở phần tiếp theo, chúng ta sẽ thực hiện một thao tác tái cấu trúc gọi là trích xuất phương thức (Extract Method) để hoàn thành việc này.

0 nhận xét:

Đăng nhận xét

 
Top