Tôi đã được dạy rằng giao diện Marker trong Java là một giao diện trống và được sử dụng để báo hiệu cho trình biên dịch hoặc JVM rằng các đối tượng của lớp thực hiện giao diện này phải được xử lý theo một cách đặc biệt, như tuần tự hóa, nhân bản, v.v.
Nhưng gần đây tôi đã biết rằng nó thực sự không liên quan gì đến trình biên dịch hoặc JVM. Ví dụ, trong trường hợp Serializable
các phương pháp giao diện writeObject(Object)
của ObjectOutputStream
làm điều gì đó như instanceOf Serializable
để phát hiện xem các cụ lớp Serializable
& ném NotSerializableException
cho phù hợp. Mọi thứ đều được xử lý trong mã và đây dường như là một mẫu thiết kế nên tôi nghĩ chúng ta có thể xác định các giao diện đánh dấu của riêng mình.
Bây giờ tôi nghi ngờ:
Là định nghĩa của một giao diện đánh dấu được đề cập ở trên trong điểm 1 sai? Làm thế nào chúng ta có thể xác định một giao diện Marker sau đó?
Và thay vì sử dụng
instanceOf
toán tử tại sao phương thức không thể giống nhưwriteObject(Serializable)
vậy để có kiểu kiểm tra thời gian biên dịch thay vì thời gian chạy?Làm thế nào là chú thích tốt hơn giao diện đánh dấu?
Serializable
như một chú thích là vô nghĩa và@NonNull
như một giao diện là vô nghĩa. Tôi sẽ nói: Chú thích là Markers + Metadata. BTW: Tiền thân của Annotations là XDoclet, sinh ra ở Javadoc, bị giết bởi Annotations.