Uczono mnie, że interfejs Marker w Javie jest pustym interfejsem i służy do sygnalizowania kompilatorowi lub JVM, że obiekty klasy implementującej ten interfejs muszą być traktowane w specjalny sposób, jak serializacja, klonowanie itp.
Ale ostatnio dowiedziałem się, że tak naprawdę nie ma to nic wspólnego z kompilatorem ani maszyną JVM. Na przykład, w przypadku Serializable
interfejsu metoda writeObject(Object)
of ObjectOutputStream
robi coś w rodzaju instanceOf Serializable
wykrycia, czy klasa implementuje Serializable
& generuje NotSerializableException
odpowiednio. Wszystko jest obsługiwane w kodzie i wydaje się, że jest to wzorzec projektowy, więc myślę, że możemy zdefiniować nasze własne interfejsy znaczników.
Teraz moje wątpliwości:
Czy definicja interfejsu znacznika wspomniana powyżej w punkcie 1 jest błędna? Jak zatem możemy zdefiniować interfejs Markera?
I zamiast używać
instanceOf
operatora, dlaczego metoda nie może być podobna dowriteObject(Serializable)
sprawdzania typu w czasie kompilacji, a nie w czasie wykonywania?W jaki sposób adnotacje są lepsze niż interfejsy znaczników?
Serializable
ponieważ adnotacja jest nonsensowna, a@NonNull
interfejs jest nonsensem. Powiedziałbym: adnotacje to znaczniki + metadane. BTW: Forefunner of Annotations był XDoclet, urodzony w Javadoc, zabity przez Annotations.