2010-01-03 38 views

Trả lời

48

Trong các phiên bản trước của Java, Marker Interfaces là cách duy nhất để khai báo siêu dữ liệu về lớp học. Ví dụ, giao diện đánh dấu nối tiếp cho phép tác giả của một lớp nói rằng lớp của chúng sẽ hoạt động chính xác khi được tuần tự hóa và deserialized.

Trong Java hiện đại, giao diện điểm đánh dấu không có chỗ. Chúng có thể được thay thế hoàn toàn bằng Annotations, cho phép khả năng siêu dữ liệu rất linh hoạt. Nếu bạn có thông tin về một lớp và thông tin đó không bao giờ thay đổi thì chú thích là một cách rất hữu ích để thể hiện nó.

+16

Tôi thực sự thích chú thích nhưng trong trường hợp này chúng có nhược điểm của việc phức tạp hơn một chút để kiểm tra (so với sử dụng instanceof). Chúng cũng không được tích hợp tốt trong javadoc (một cách nhanh chóng để xem những gì thực hiện hay không là chỉ tìm kiếm nó và xem danh sách các lớp thực hiện). Vì vậy, tôi sẽ nói rằng họ vẫn có một nơi, không chỉ là một nơi không kém phần quan trọng. – Fredrik

+9

@ Chris vậy bạn có đúng hay là Josh Bloch ngay tại đây? http://stackoverflow.com/a/5080547/632951 – Pacerier

+1

@Pacerier Tôi cho rằng vì các giao diện điểm đánh dấu xác định không có hành vi, chúng chủ yếu là vô nghĩa đối với an toàn kiểu.Chỉ vì một lớp được đánh dấu tuần tự không có nghĩa là nó có thể được tuần tự một cách chính xác, và thiếu giao diện điểm đánh dấu không ngụ ý việc tuần tự hóa sẽ không hoạt động. Nó có thể chỉ có nghĩa là các nhà phát triển sai lầm đánh dấu nó! Nếu giao diện thực sự có các phương thức (và không còn là dấu hiệu), thì nó sẽ thực thi một hợp đồng hành vi. Nó cũng là công việc nhiều hơn để bao gồm siêu dữ liệu bổ sung với một giao diện đánh dấu, trong khi với chú thích nó là một phần của điểm. –

4

Nó chỉ ra rằng lớp (và do đó tất cả các trường không thoáng qua) là các ứng cử viên cho tuần tự hóa. Và nếu bạn đang xây dựng một khung dựa trên việc tuần tự hóa, bạn có thể viết một phương pháp như vậy:

public void registerObject(Serializable obj); 

để giới hạn các lớp bạn sẵn sàng chấp nhận.

Vì đối tượng được tuần tự cần duy trì khả năng tương thích giữa các hệ thống, việc tuần tự hóa là quyết định thiết kế rõ ràng và do đó yêu cầu sử dụng giao diện điểm đánh dấu.

Ngoài ra còn có một khía cạnh bảo mật. Bạn không muốn làm mọi thứ có thể nối tiếp được - nếu không bạn có thể vô tình phơi bày mật khẩu hoặc các dữ liệu nhạy cảm khác thông qua serialization.

6

Các giao diện điểm đánh dấu này hữu ích trong trường hợp mã khác đưa ra quyết định tùy thuộc vào việc một đối tượng có triển khai một số giao diện điểm đánh dấu hay không.

Trong trường hợp Serializable, phản chiếu sẽ được sử dụng để tuần tự hóa các trường của đối tượng.

Bây giờ chú thích được ưa thích vì chúng không được truyền cho các lớp con.

Xem Marker interface pattern.

+2

Serializable, không ISerializable :) – Bozho

+1

yeah Tôi sai lầm nó lên, tôi luôn tiền tố tên giao diện của tôi với "I" :) –

+3

@Gregory Heresy, đây là Java! Và ngay cả trong thế giới .NET, quy ước COM (xấu) này nên bị lãng quên! –

2

Chúng được gọi là điểm đánh dấu giao diện. Và như tên của nó, họ đánh dấu rằng một số đối tượng có sẵn cho một số loại hoạt động nhất định.

Serializable có nghĩa là đối tượng đủ điều kiện để tuần tự hóa java, chẳng hạn.

Nó đã được thảo luận xem chúng không nên được thay thế bằng chú thích, vì chức năng của chúng khá giống nhau.

2

Nếu bạn triển khai giao diện thì instanceof sẽ là đúng. Nếu giao diện của bạn không có gì để thực hiện thì bạn có thể sử dụng điều này để đánh dấu một lớp với siêu dữ liệu như chú thích làm cho Java 1.5 trở lên mà không phải ép buộc người triển khai thực hiện bất kỳ điều gì đặc biệt.

1

Bạn có quyền lý luận rằng giao diện trống không ảnh hưởng đến việc thực hiện "chuẩn" của chương trình dựa trên sự kiểm tra/đột biến của trường và gửi phương thức.Tuy nhiên, giao diện điểm đánh dấu rất hữu ích khi được sử dụng kết hợp với sự phản chiếu: Thư viện/phương pháp kiểm tra (qua phản xạ) một đối tượng và hoạt động khác nhau nếu lớp của nó bổ sung giao diện điểm đánh dấu. Theo Java5, có rất ít nhu cầu về giao diện điểm đánh dấu - cơ sở "đánh dấu" tương tự có thể đạt được thông qua chú thích Java - mà (một lần nữa) hầu hết hiệu ứng của chúng sẽ đạt được thông qua mã dựa trên sự phản chiếu.

75

Joshua Bloch: Effective Java 2nd Edition, p 179

mục 37: Sử dụng giao diện đánh dấu để xác định các loại

... Bạn có thể nghe nó nói rằng marker chú thích (Khoản 35) làm cho điểm đánh dấu giao diện lỗi thời. Xác nhận này là không chính xác. Giao diện điểm đánh dấu có hai lợi thế đối với chú thích đánh dấu. Đầu tiên và quan trọng nhất, giao diện điểm đánh dấu xác định loại được triển khai bởi trường hợp của lớp được đánh dấu; marker chú thích thì không. Sự tồn tại của loại này cho phép bạn bắt lỗi tại thời gian biên dịch mà bạn có thể không bắt cho đến khi thời gian chạy nếu bạn sử dụng một chú thích marker ....

Cá nhân tôi nghĩ rằng tôi sẽ cúi đầu trước của Joshua kiến thức cao cấp về chủ đề này.

+2

Yup ... rất đẹp :) – agpt

+0

Vấn đề là, điều này thường mâu thuẫn với Mục 19: Chỉ sử dụng giao diện để xác định loại. "Serializable" không phải là một loại, đó là một tài sản/hành vi. –

+3

Trên thực tế, ngay cả "Serializable" có thể được xem như là một loại. Hãy xem xét chữ ký phương thức sau đây: tuần tự void công cộng (Serializable objectToSerialize); Trong trường hợp này, rõ ràng tại thời gian biên dịch mà chỉ có các đối tượng tuần tự có thể được chuyển tới "serialize", điều này là không thể với chú thích. –

-1

Mục đích chính là cho trình biên dịch xử lý khác nhau đối với đối tượng của lớp đã triển khai giao diện điểm đánh dấu.

+1

Điều này là sai. Trình biên dịch Java hoặc JVM không có gì đặc biệt cho Serializable và các giao diện đánh dấu khác, nhưng các lớp thư viện java tiêu thụ nó cần phải nhận biết các đối tượng Serializable và chúng có thể xem xét nó và xử lý các đối tượng khác nhau, chứ không phải trình biên dịch hoặc JVM. Đây là một quan niệm sai lầm phổ biến về giao diện Marker. –

-1

Tìm hiểu kỹ về giao diện điểm đánh dấu trong Java, ví dụ: Serializable, Clonnable và Remote có vẻ như chúng được sử dụng để chỉ ra một cái gì đó để trình biên dịch hoặc JVM. Vì vậy, nếu JVM thấy một Class là Serializable nó thực hiện một số hoạt động đặc biệt trên nó, tương tự như cách nếu JVM thấy một Class đang thực hiện Clonnable nó thực hiện một số hoạt động để hỗ trợ nhân bản. Điều này cũng đúng đối với RMI và giao diện Remote. Vì vậy, trong giao diện Marker ngắn cho biết, tín hiệu hoặc một lệnh để Compiler hoặc JVM.

Read more: http://javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html#ixzz2v6fIh1rw

+1

Điều này là sai. Trình biên dịch Java hoặc JVM không có gì đặc biệt cho Serializable và các giao diện đánh dấu khác, nhưng các lớp thư viện java tiêu thụ nó cần phải nhận biết các đối tượng Serializable và chúng có thể xem xét nó và xử lý các đối tượng khác nhau, chứ không phải trình biên dịch hoặc JVM. Đây là một quan niệm sai lầm phổ biến về giao diện Marker. –

Các vấn đề liên quan