Có lẽ vì việc mở rộng và ghi đè một số phương pháp của nó có thể sẽ phá vỡ nó. Và làm cho nó dễ dàng hơn để ghi đè lên các phương thức sẽ cho thấy nhiều hoạt động bên trong, vì vậy nếu trong tương lai họ quyết định thay đổi chúng (vì hiệu suất hoặc một số lý do khác), sẽ khó thay đổi lớp mà không phá vỡ tất cả các lớp mở rộng nó.
Ví dụ, hãy xem xét các phương pháp sau đây trong lớp:
public boolean nextBoolean() {
clearCaches();
return Boolean.parseBoolean(next(boolPattern()));
}
Giả sử bạn muốn ghi đè lên điều này bởi vì bạn muốn chắc 'tuyệt vời' đánh giá để một boolean 'true' (vì lý do gì). Nếu bạn ghi đè lên nó, bạn không thể gọi super.nextBoolean(), vì điều đó sẽ tiêu thụ mã thông báo tiếp theo bằng cách sử dụng logic mặc định. Nhưng nếu bạn không gọi super.nextBoolean(), clearCaches() sẽ không được gọi, có thể phá vỡ các phương thức không ghi đè khác. Bạn không thể gọi clearCaches() vì nó là riêng tư. Nếu họ làm cho nó được bảo vệ, nhưng sau đó nhận ra rằng nó gây ra một vấn đề hiệu suất, và muốn có một thực hiện mới mà không xóa cache nữa, sau đó họ có thể phá vỡ thực hiện ghi đè của bạn mà vẫn sẽ được gọi đó. Vì vậy, về cơ bản nó là để họ có thể dễ dàng thay đổi các phần ẩn bên trong lớp, khá phức tạp và bảo vệ bạn khỏi việc tạo ra một lớp con bị hỏng (hoặc một lớp có thể dễ dàng bị phá vỡ).
Nguồn
2010-09-23 09:39:41
Nếu điều này liên quan đến hiệu suất, liệu lý thuyết có thể tạo Máy quét không hoạt động có thể mở rộng được không? Logic của tôi nói rằng nó nên được? – Roalt