2015-05-05 13 views
5

Nó được coi là một thực hành tốt đểThiếu @ Override trong Java Thư viện

sử dụng @ Override chú thích về phương pháp mà đang được overriden trong lớp con.

Nhưng tại sao lại không áp dụng cho các lớp đi kèm với Thư viện Java. Ví dụ: Chuỗi Lớp. Nó ghi đè các phương thức của lớp Object nhưng không sử dụng chú thích @Override về các phương pháp này.

Đây có phải là như vậy để duy trì khả năng tương thích ngược với các phiên bản trước của Java như 1,4, vv

Cảm ơn

+0

Thưa bạn, câu hỏi này của tôi không trùng lặp với câu hỏi Khi nào bạn sử dụng chú thích Ghi đè của Java và tại sao? Bởi vì tôi cần phải hỏi tại sao Override không được sử dụng trong Thư viện Java – Ankit

+1

@Ankit Các thư viện đến trước, các chú thích đến sau. Họ có thể không có bằng tốt nghiệp hoặc thực tập xung quanh để đi qua toàn bộ mã thư viện chỉ để thêm ghi đè ghi đè: P – MadProgrammer

+0

@Ankit bạn có thể đúng - dường như đủ khác nhau - bỏ tuyên bố. – YoYo

Trả lời

4

Đó không phải là nhiều hơn nữa của một chú thích mỹ phẩm, nó rất hữu ích khi tạo tài liệu, để đưa ra gợi ý thông qua Java IDE của bạn và một cách rõ ràng nhà nước khi một phương pháp được overriden.

Từ quan điểm triển khai thư viện thời gian chạy/chuẩn, nó không đáng để sửa đổi tất cả các lớp hiện có chỉ để thêm một thứ gì đó mỹ phẩm.

Bên cạnh đó, liên quan đến khả năng tương thích ngược của chú thích nói chung, xem xét rằng chú thích là một thuộc tính tùy chọn và mở rộng hiện diện trong .class tập tin (khi duy trì chính sách của họ là một trong hai CLASS hoặc RUNTIME và có sẵn để ClassMethod như Runtime(In)VisibleAnnotations và cho Parameter như Runtime(In)VisibleParameterAnnotations) các phiên bản trước của JVM sẽ đơn giản bỏ qua thuộc tính đó trong quá trình phân tích cú pháp tệp .class được thực hiện lần đầu tiên mà Lớp là cần thiết. Nhưng thực tế, 1,4 trình phân tích lớp JVM đó thậm chí sẽ không đạt đến điểm mà thuộc tính Chú thích .class được đặt bên trong cấu trúc vì việc phân tích cú pháp sẽ kết thúc đột ngột khi JVM sẽ nhận thấy phiên bản .class lớn hơn phiên bản được hỗ trợ.

3

@override chú thích được sử dụng để cung cấp một số thông tin bổ sung, chủ yếu trong khi tạo tài liệu và cũng để thông báo cho nhà phát triển rằng mã dự định ghi đè phương thức từ siêu lớp.

Điều này được đề cập trong tài liệu oracle.

Chú thích @Override @Override thông báo cho trình biên dịch rằng phần tử có nghĩa là ghi đè lên phần tử được khai báo trong một siêu lớp. Ghi đè các phương pháp sẽ được thảo luận trong Giao diện và Thừa kế.

// phương pháp đánh dấu như một phương pháp lớp cha // đã được ghi đè @ Override int overriddenMethod() {}

Trong khi nó không phải là cần thiết để sử dụng chú thích này khi trọng một phương pháp , nó giúp ngăn ngừa lỗi. Nếu phương thức được đánh dấu bằng @Override không ghi đè chính xác phương thức trong một trong các lớp bậc trên của nó, trình biên dịch sẽ phát sinh lỗi.

Hãy tham khảo chính điều này discussion trong SO.

+0

Cảm ơn câu trả lời của bạn Sir – Ankit

4

Trong một API, nó không cung cấp nhiều cho người dùng (của API đó). Tuy nhiên, khi bạn thực hiện một phương thức, và bạn 'có ý định' ghi đè lên một lớp siêu, nó rất dễ bỏ lỡ chữ ký của phương thức, mà nó được cho là phù hợp.

Trong trường hợp này, @Override đến để giải cứu tại thời điểm biên dịch, nó sẽ không thành công hoặc đưa ra cảnh báo khi ghi đè không không xảy ra. Ngoài ra nhiều IDE nhận ra @Override và cung cấp cho bạn đủ hỗ trợ để gắn cờ và sửa những tình huống đó trước khi bạn biên dịch.

Vì vậy, @Override về bản chất tuyên bố ý định của bạn rằng phương pháp này sẽ ghi đè điều gì đó. Người dùng API sẽ quan tâm đến mục đích của bạn, miễn là nó hoạt động.

Thực ra, có lẽ lý do thực sự là: Retention của chú thích @Override được đặt thành SOURCE. Điều này có nghĩa là cờ @Override bị hủy khi được biên dịch thành tệp lớp.

@Target(value=METHOD) 
@Retention(value=SOURCE) 
public @interface Override 
+0

Cảm ơn câu trả lời của bạn – Ankit