2012-05-11 10 views
5

Chcę napisać własne interfejsy znaczników, takie jak java.io.Serializable lub Cloneable, które mogą być zrozumiałe dla JVM. Proszę zasugerować mi procedurę wdrożenia.możemy pisać niestandardowe interfejsy znaczników

Na przykład zaimplementowałem interfejs o nazwie NotInheritable i wszystkie klasy implementujące ten interfejs muszą unikać dziedziczenia.

+3

Co masz na myśli przez 'zrozumiałe JVM'? –

+0

Nie, ale JVM obsługuje http://docs.oracle.com/javase/tutorial/java/IandI/final.html, aby oznaczyć klasy jako "nie dziedziczne". – OrangeDog

+0

Odpowiedź brzmi NIE, Jeśli chcesz utworzyć dowolny znacznik "Interfejs znaczenia", to nie możesz go utworzyć. Ale jeśli chcesz utworzyć interfejs znacznika tylko po to, aby sprawdzić, czy obiekt klasy jest obiektem tego interfejsu znacznika, to możesz TAK. Aby utworzyć interfejs Marker "Zrozumiałe dla JVM", jvm musi zostać spersonalizowany i nie jestem pewien, czy można to zrobić. – uniquephase

Odpowiedz

3
public interface MyMarkerInterface {} 

public class MyMarkedClass implements MyMarkerInterface {} 

Wtedy można mieć na przykład metoda biorąc tylko MyMarkerInterface instancji:

public myMethod(MyMarkerInterface x) {} 

lub skontaktować się z instanceof przy starcie.

-3

Interfejs znacznika to pusty interfejs. Oznacza to, że wystarczy utworzyć interfejs i nie tworzyć w nim żadnej metody. Lepsze wyjaśnienie znajdziesz here.

To podejście można zastąpić przez Annotations, które mają podobną funkcjonalność w stosunku do typów. more

+0

producent nadal ma tam swoje znaczenie. – Simmant

0

Możesz napisać własny interfejs Markera, JVM nic o nim nie wie.

Musisz zapewnić funkcjonalność za pomocą instanceof. check this

1

Załóżmy, że myMethod powinno być wywoływane tylko wtedy, gdy znacznik MyInterface powinien być tam oznaczony.

interface MyInterface{} 

class MyException extends RuntimeException{ 

    public MyException(){} 
    public MyException(String message){ 
     super(message); 
    } 
} 

class MyClass implements MyInterface{ 
    public void myMethod(){ 
     if(!(this instanceOf MyInterface)){ 
      throw new MyException(); 
     }else{ 
      // DO YOUR WORK 
     } 
    } 
} 
2

Tak Możemy napisać własny wyjątek markera .... patrz poniższy przykład ....

interface Marker{ 
} 

class MyException extends Exception { 

    public MyException(String s){ 
     super(s); 
    } 
} 

class A implements Marker { 

    void m1() throws MyException{   
    if((this instanceof Marker)){ 
     System.out.println("successfull"); 
    } 
    else { 
     throw new MyException("Unsuccessful class must implement interface Marker "); 
    }  
} 
} 

/* Class B has not implemented Maker interface . 
* will not work & print unsuccessful Must implement interface Marker 
*/ 
class B extends A {  


} 

// Class C has not implemented Maker interface . Will work & print successful 

public class C extends A implements Marker 
{ // if this class will not implement Marker, throw exception 
    public static void main(String[] args) { 
    C a= new C(); 
    B b = new B(); 

    try { 
     a.m1(); // Calling m1() and will print 
     b.m1(); 
    } catch (MyException e) { 

     System.out.println(e); 
    } 

} 
} 

OUTOPUT

+1

Przykład wydaje się całkowicie bezcelowy. Dlaczego po prostu nie miałbyś klasy Aa implementującej interfejs znaczników? – EJP