2010-12-27 13 views

Odpowiedz

21

Interfejs znacznika nie "działa" jako taki. Jak sama nazwa wskazuje, po prostu oznacza klasę jako konkretny typ. Jakiś inny kod musi sprawdzić istnienie znacznika i zrobić coś na podstawie tych informacji.

W dzisiejszych czasach adnotacje często pełnią tę samą rolę, co wcześniej, w przypadku interfejsów znaczników.

+0

Witaj Dan, popraw mnie, jeśli moje zrozumienie jest złe. Jak sama nazwa wskazuje "znacznik", oznacza to, że jak tylko dowolna klasa implementuje interfejs znacznika, zakłada się, że w czasie wykonywania JVM użyje jakiegoś mechanizmu do zidentyfikowania tej klasy jako oznaczonej do implementacji interfejsu, takiego jak klonowanie. – Kamal

+0

@ Dan, Ponieważ powiedziałeś "" Jakiś inny kod musi sprawdzić istnienie znacznika i zrobić coś na podstawie tych informacji. "., Czy możesz podać przykład/scenariusz dla tego samego, – Deepak

+1

@Kamal Nie, a Interfejs znacznika nie ma specjalnego znaczenia dla JVM i sam w sobie nie daje żadnych dodatkowych funkcji. W przypadku Cloneable, po prostu informuje inny kod, że twórca tej klasy gwarantuje, że instancje są odpowiednio klonowalne. Cloneable jest prawdopodobnie dobrym przykładem niewłaściwego wykorzystania interfejsu znacznika.Interfejs powinien naprawdę wymusić udostępnienie publicznej metody klonowania. –

21

Jedyną sensowną rzeczą, jaką możesz zrobić z nią to

if (instance instanceof MyMarkerInterface) { 
    ... 
} 
6

interfejsy Marker można zastąpić adnotacji w wielu miejscach, jednak interfejsy marker może być nadal stosowany do

  • kompilacji kontrole czasu. Możesz mieć metodę, która musi przyjąć obiekt klasy z danym interfejsem (interfejsami) znacznika, np.

    public void myMethod(MyMarkerInterface MMI); 
    

Nie można mieć to skompilować sprawdzić czas korzystania sam adnotację.

BTW: Możesz mieć dwa interfejsy używając generycznych, ale dobre przykłady są rzadkie.

  • Podstawy wsparcia zależne od interfejsu (interfejsów) do identyfikacji typu komponentu. jak OSGi.

EDYCJA: Używam tego dla interfejsu znacznika Listener. Słuchacz ma metody metod oznaczone adnotacjami, ale metody mogą mieć dowolną nazwę lub typ. Dodaje kontrolę czasu kompilacji do tego, co w przeciwnym razie byłoby łączem czysto wykonawczym.

public Component implements Listener { 

@ListenerCallback 
public void onEventOne(EventOne... eventOneBatch) { } 

@ListenerCallback 
public void onEventTwo(EventTwo eventTwo) { } 
} 
+3

Twój 'myMethod' jest mniej lub bardziej bezużyteczny, ponieważ co można zrobić z interfejsem * marker *, który nie ma więcej metod niż' Object'? – Mot

+0

@MikeL. Przejrzyj dokumentację 'java.lang.Cloneable' i' java.util.RandomAccess' dla "dobrych" przykładów (_good_ jak w _ zrobiłem to w ten sposób przed wprowadzeniem adnotacji_). – Feuermurmel

+0

@Feuermurmel Nie będę liczyć Klonowalnego jako dobry przykład interfejsu znacznika, ponieważ nie jest jasne, dlaczego nie ma on metody 'public Object clone()'. –

0

Interfejs znacznika informuje JVM, że klasa jest oznaczona interfejsem znacznika w celu dodania funkcjonalności interfejsu znacznika. Podobnie jak implementacja Cloneable mówi JVM, że ta klasa implementuje Cloneable, a zatem JVM będzie musiała skopiować ją w sposób bitowy.

1

Interfejs znacznika w Javie to interfejsy bez pól i metod lub w prostym słowie pusty interfejs w java nazywany jest interfejsem znacznika. na przykład Serializowalny, Clonnable i Remote Interface. Służą do wskazywania sygnału lub polecenia kompilatorowi lub maszynie JVM. Może być również używany do klasyfikowania kodu. Możesz także napisać swój własny interfejs znaczników i użyć ich do logicznego podziału kodu. Możesz także zapisać dowolną operację przetwarzania wstępnego na tych klasach.

Powiązane problemy