Domanda Come scrivere la nostra interfaccia marker in Java?


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.

  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?

Per favore guidami a risolvere questo problema.


10
2018-06-13 03:59


origine


risposte:


  1. La serializzazione è gestita dal ObjectInputStream e ObjectOutputStream classi. Se una classe ha esigenze di serializzazione speciali, i metodi per creare sono delineati nel API. Reflection è usato per invocare questi metodi.

  2. Allo stesso modo in cui scriveresti qualsiasi altra interfaccia.

  3. Non c'è nulla che ti impedisca di mettere i metodi in un'interfaccia marcatore.

La pratica più comune ora è quella di usare annotazioni fornire le stesse interfacce degli indicatori di metadati.


12
2018-06-13 04:08



  • Come JVM invoca questo comportamento specifico

ObjectOutputStream e ObjectInputStream controllerà la tua classe indipendentemente dal fatto che si attui o meno Serializable, Externalizable. Se sì, continuerà o verrà lanciato NonSerializableException.

  • Come scrivere la nostra interfaccia marker

Crea un'interfaccia senza alcun metodo e questa è l'interfaccia del tuo marcatore.

Campione

public interface IMarkerEntity {


}

Se una classe che implementa questa interfaccia verrà presa come entità di database dall'applicazione.

Codice d'esempio:

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

L'intera idea di Marker Interface Pattern è quello di fornire un mezzo per dire "sì, io sono qualcosa" e quindi il sistema procederà con il processo predefinito, come quando contrassegni la classe come Serializzabile, solo dice che questa classe può essere convertita in byte.


22
2018-06-13 04:11



Come spiegato molto bene nell'articolo di Wikipedia Modello di interfaccia Marker, un'interfaccia marcatore è 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 {
}

Quindi il codice può verificare se un oggetto è un CoolObject e fare qualcosa con esso:

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

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

È possibile aggiungere metodi all'interfaccia marker, ma questo mescola il pattern marker con altri usi concettuali per le interfacce e può essere fonte di 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 annotazioni.


2
2018-06-13 04:09



Sì, possiamo creare la nostra interfaccia Marker ... Vedi il seguente ...

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);
        }


    }

}

2
2018-03-02 10:24



L'interfaccia Marker non ha alcun 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. Crea l'interfaccia vuota

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

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

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

1
2018-02-08 20:03



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 hai un'interfaccia marcatore "Saveable". Si ha un processo che attraversa tutte le classi che implementano questa interfaccia (tramite riflessione) e quindi salva l'operazione su di essa.


0
2018-06-13 04:09