2012-06-13 12 views
9

Conosco l'interfaccia marker in java. È usato per definire un comportamento specifico su una classe. Ad esempio, l'interfaccia serializzabile ha la capacità specifica di memorizzare un oggetto nel flusso di byte e il suo processo inverso. Ma non so dove viene implementato questo specifico comportamento, perché non ha alcun metodo in esso.Come scrivere la nostra interfaccia marker in Java?

  1. In che modo JVM richiama questo comportamento specifico?
  2. Come scrivere la nostra interfaccia marker? Puoi darmi una semplice interfaccia marcatore definita dall'utente per la mia comprensione?
  3. È possibile avere metodi nell'interfaccia marker?

Guidami per risolvere questo problema.

+0

Perché vuoi scrivere l'interfaccia marker? È una specie di cosa obsoleta. Usa _annotations _.... comunque, perché useresti la tua "interfaccia marker" –

+0

@Op De Cirkel? Sicuramente non Obsoleta, In primo luogo, le interfacce marker definiscono un tipo che è implementato dalle istanze della classe marcata; le annotazioni dei marcatori no. Leggi l'articolo java 2a edizione 37 per ulteriori dettagli. – Premraj

risposta

11
  1. serializzazione viene gestito dalle classi ObjectInputStream e ObjectOutputStream. Se una classe ha esigenze di serializzazione speciali, i metodi da creare sono descritti nello API. Reflection è usato per invocare questi metodi.

  2. Allo stesso modo in cui si scriverebbe un'altra interfaccia.

  3. Non c'è niente che ti impedisca di inserire metodi nell'interfaccia marker.

La pratica più comune ora è quello di utilizzare annotations per fornire gli stessi metadati interfacce marcatori forniscono.

+0

: grazie mille ...mi piacerebbe sapere in quale posto stanno scrivendo il codice per relazionare la classe ObjectInputStream ... allora solo io posso scrivere la mia interfaccia marker come serilizable ... – Saravanan

+0

Passa attraverso la fonte delle classi menzionate invece di chiedere le righe esatte !! – Premraj

+3

@Saravanan Il JDK è open source. [ 'ObjectInputStream'] (http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectInputStream.java/?v=source). [ 'ObjectOutputStream'] (http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectOutputStream.java/?v=source). – Jeffrey

0

Per quanto ne so, le interfacce marker ottengono il loro comportamento dalle classi "utility". Ad esempio, se hai letto il libro Pattern Design della Gang of Four, hai il comportamento di una classe taggata con un'interfaccia marker definita in un'altra classe.

Ad esempio si dispone di un'interfaccia marker "Saveable". Si ha un processo che attraversa tutte le classi che implementano questa interfaccia (tramite riflessione) e quindi salva l'operazione su di essa.

2

Come spiegato molto chiaramente nell'articolo di Wikipedia Marker interface pattern, un'interfaccia marker è una forma di metadati. Il codice client può verificare se un oggetto è un'istanza dell'interfaccia marcatore e adattare di conseguenza il suo comportamento (del cliente). Ecco un'interfaccia marcatore:

public interface CoolObject { 
} 

Poi codice possibile verificare se un oggetto è un CoolObject e fare qualcosa con esso:

if (anObject instanceof CoolObject) { 
    addToCoolList((CoolObject) anObject); 
} 

L'interfaccia Serializable è definito come parte del linguaggio Java. Non è possibile implementare il comportamento a quel livello da soli.

È possibile aggiungere metodi all'interfaccia di un marker, ma questo mescola il modello di marker con altri usi concettuali per le interfacce e può creare confusione. (Una classe implementa l'interfaccia allo scopo di contrassegnarla, o per il suo comportamento, o entrambi?)

Come spiegato nell'articolo di Wikipedia, le interfacce marker in Java possono (e probabilmente dovrebbero) essere sostituite con annotations.

17
  • Come JVM invocare questo comportamento specifico

ObjectOutputStream e ObjectInputStream controllerà la vostra classe se sia o non implementes Serializable, Externalizable. Se sì, continuerà altrimenti verrà lanciato NonSerializableException.

  • Come scrivere la nostra propria interfaccia marcatore

creare un'interfaccia senza alcun metodo e che è l'interfaccia marcatore.

Esempio

public interface IMarkerEntity { 


} 

Se una classe che implementa questa interfaccia sarà preso come entità database dell'applicazione.

codice di esempio:

public boolean save(Object object) throws InvalidEntityException { 
    if(!(object instanceof IMarkerEntity)) { 
     throw new InvalidEntityException("Invalid Entity Found, cannot proceed); 
    } 
    database.save(object); 
} 
  • Questo è possibile avere metodi dell'interfaccia marcatore?

L'intera idea di Marker Interface Pattern è quello di fornire un mezzo per dire "sì, io sono qualcosa" e poi il sistema procederà con il processo di default, come quando si contrassegna la classe come Serialzable si dice solo che questa classe può essere convertito in byte.

+3

Questo deve b la risposta –

2

Sì possiamo creare la nostra Marker interface..See successivo ...

interface Marker{ 
} 

class MyException extends Exception { 
    public MyException(String s){ 
     super(s); 
    } 
} 

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

public class CustomMarkerInterfaceExample extends A implements Marker 
{ // if this class will not implement Marker, throw exception 
    public static void main(String[] args) { 
     CustomMarkerInterfaceExample a= new CustomMarkerInterfaceExample(); 
     try { 
      a.m1(); 
     } catch (MyException e) { 

      System.out.println(e); 
     } 


    } 

} 
0

interfaccia Marker non ha un metodo. Java ha un'interfaccia marker incorporata come Serializable, Clonable & EventListner ecc. Che sono comprensibili da JVM.

Possiamo creare la nostra interfaccia marker, ma non ha nulla a che fare con JVM, possiamo aggiungere alcuni controlli con instanceOf.

  1. creare l'interfaccia vuota

    interface Marker{ } 
    
  2. Scrivi una classe e implementa l'interfaccia

    class A implements Marker { 
        //do some task 
    } 
    
  3. Main classe per verificare l'interfaccia marcatore instanceof

    class Main { 
        public static void main(String[] args) { 
         A ob = new A()[ 
         if (ob instanceOf Marker) { 
          // do some task 
         } 
        } 
    } 
    
+1

Si potrebbe voler prestare più attenzione, quando scrivi codice, perché il tuo codice per il punto 3 ha diversi errori. – Tom