2013-03-04 8 views
5

Ponieważ interfejsy znaczników są przydatne głównie do zaznaczania klasy, to samo można osiągnąć za pomocą adnotacji. Na przykład interfejs Cloneable może być @Cloneable.Czy adnotacje całkowicie zastępują interfejsy znaczników?

Czy nadal potrzebne są interfejsy znaczników lub czy można je zoptymalizować za pomocą Adnotacji? Czy jest jakaś zaleta/wada korzystania z którejkolwiek z nich? Chodzi mi o to, czy preferujesz jedną nad drugą?

+1

Interfejs markera został ustanowiony jako antipattern nawet przed Generics. –

+0

@MarkoTopolnik wymagało wcześniejszych interfejsów znaczników dla metadanych, ale to samo można teraz osiągnąć za pomocą adnotacji. Dlatego nazywa się to anty-wzorem, mam rację? –

+0

Tak, plus nawet na Java 1.4 były zalecenia do zaprojektowania bez interfejsów znaczników. Interfejsy markerów są nadużyciem koncepcji polimorfizmu. –

Odpowiedz

3

Interfejsy znaczników są lepsze niż adnotacje, gdy są używane do definiowania typu. Na przykład Serializable może być używany (i powinien być używany) jako typ argumentu, który musi być możliwy do serializacji. Adnotacja nie pozwala to robić:

public void writeToFile(Serializable object); 

Jeśli interfejs marker nie definiuje typ, ale tylko meta-dane, a następnie adnotacja jest lepsza.

1

Jeszcze jedna rzecz, o której warto wspomnieć, to koszt korzystania z adnotacji. Aby sprawdzić, czy obiekt jest instancją interfejsu, można teraz użyć funkcji instanceof, która jest stosunkowo niedrogą operacją. Korzystanie z adnotacji wymaga wywołań Java reflection i jest znacznie droższe.

Powiązane problemy