Kết luận
Sau khi mổ xẻ bốn ví dụ được lựa chọn tùy ý về việc thực hiện bằng (), chúng ta kết luận điều gì?
Trước hết: có hai cách khác nhau để thực hiện kiểm tra đối sánh loại trong việc thực hiện bằng (). Một lớp có thể cho phép so sánh kiểu hỗn hợp giữa các đối tượng siêu và lớp con bằng toán tử thể hiện hoặc một lớp có thể coi các đối tượng thuộc loại khác là không bằng nhau bằng phép thử getClass (). Các ví dụ ở trên minh họa độc đáo rằng việc triển khai bằng () bằng cách sử dụng getClass () thường mạnh hơn so với các triển khai sử dụng instanceof.
Kiểm tra thể hiện chỉ đúng cho các lớp cuối cùng hoặc nếu ít nhất phương thức bằng () là cuối cùng trong một siêu lớp. Về cơ bản, hàm ý rằng không có lớp con nào phải mở rộng trạng thái của lớp cha, mà chỉ có thể thêm chức năng hoặc các trường không liên quan đến trạng thái và hành vi của đối tượng, chẳng hạn như trường tạm thời hoặc trường tĩnh.
Mặt khác, việc sử dụng thử nghiệm getClass () luôn tuân thủ hợp đồng bằng (); họ đúng và mạnh mẽ Tuy nhiên, chúng rất khác biệt về mặt ngữ nghĩa so với việc triển khai sử dụng thử nghiệm thể hiện. Việc triển khai bằng getClass () không cho phép so sánh giữa các đối tượng siêu lớp, ngay cả khi lớp con không thêm bất kỳ trường nào và thậm chí không muốn ghi đè bằng (). Ví dụ, một phần mở rộng lớp "tầm thường" như vậy sẽ là sự bổ sung của phương thức in gỡ lỗi trong một lớp con được xác định chính xác cho mục đích "tầm thường" này. Nếu siêu lớp cấm so sánh kiểu hỗn hợp thông qua kiểm tra getClass (), thì phần mở rộng tầm thường sẽ không thể so sánh với siêu lớp của nó. Đây có phải là một vấn đề hoàn toàn hay không phụ thuộc vào ngữ nghĩa của lớp học và mục đích của phần mở rộng.
x instanceof SomeClass
là sai nếux
lànull
. Do đó, cú pháp thứ hai không cần kiểm tra null.