2012-06-13 22 views
9

Sé la interfaz de marcador en java. Se usa para definir un comportamiento específico sobre una clase. Por ejemplo, la interfaz Serializable tiene la capacidad específica de almacenar un objeto en una secuencia de bytes y su proceso inverso. Pero no sé dónde se implementa este comportamiento específico, porque no tiene ningún método.¿Cómo escribir nuestra propia interfaz de marcador en Java?

  1. ¿Cómo invocó JVM este comportamiento específico?
  2. ¿Cómo escribir nuestra propia interfaz de marcador? ¿Puede darme una simple interfaz de marcador definida por el usuario para mi comprensión?
  3. ¿Es posible tener métodos en la interfaz de marcador?

Por favor, guíame para resolver este problema.

+0

¿Por qué quieres escribir la interfaz de marcador? Es algo obsoleto. Use _annotaciones _.... de todos modos, ¿para qué usaría su propia "interfaz de marcador" –

+0

@Op De Cirkel? Definitivamente no es obsoleta, lo primero y más importante, las interfaces de marcador definen un tipo que se implementa mediante instancias de la clase marcada; las anotaciones de marcador no. Lea Effective java 2nd edition Item 37 para más detalles. – Premraj

Respuesta

11
  1. serialización es manejado por las clases ObjectInputStream y ObjectOutputStream. Si una clase tiene necesidades especiales de serialización, los métodos para crear se describen en el API. La reflexión se usa para invocar estos métodos.

  2. De la misma manera que escribiría cualquier otra interfaz.

  3. No hay nada que le impida poner métodos en una interfaz de marcador.

La práctica más común ahora es utilizar annotations para proporcionar los mismos metadatos interfaces de marcador proporcionan.

+0

: muchas gracias ...me gustaría saber en qué lugar están escribiendo el código para relacionar la clase ObjectInputStream ...? entonces solo puedo escribir mi propia interfaz de marcador como serilizable ... – Saravanan

+0

¡Vaya a través de la fuente de las clases mencionadas en lugar de preguntar las líneas exactas! – Premraj

+3

@Saravanan El JDK es de código abierto. ['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

Por lo que sé, las interfaces de marcador obtienen su comportamiento por clases de "utilidad". Por ejemplo, si ha leído el libro Patrones de diseño de la Banda de los Cuatro, tiene el comportamiento de una clase etiquetada con una interfaz de marcador definida en otra clase.

Por ejemplo, tiene una interfaz de marcador "Saveable". Tiene un proceso que atraviesa todas las clases que implementan esta interfaz (a través de la reflexión) y luego guarda la operación en él.

2

Como se explica muy bien en el artículo de Wikipedia Marker interface pattern, una interfaz de marcador es una forma de metadatos. El código de cliente puede probar si un objeto es una instancia de la interfaz de marcador y adaptar su comportamiento (el del cliente) en consecuencia. Aquí hay una interfaz de marcador:

public interface CoolObject { 
} 

Luego código puede comprobar si un objeto es un CoolObject y hacer algo con él:

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

La interfaz Serializable se define como parte del lenguaje Java. No puedes implementar el comportamiento en ese nivel tú mismo.

Puede agregar métodos a una interfaz de marcador, pero eso mezcla el patrón de marcador con otros usos conceptuales para las interfaces y puede ser confuso. (¿Es una clase que implementa la interfaz con el propósito de marcarla, o por su comportamiento, o ambas cosas?)

Como se explica en el artículo de Wikipedia, las interfaces de marcado en Java pueden (y probablemente deberían) reemplazarse con annotations.

17
  • Cómo JVM invocar este comportamiento específico

ObjectOutputStreamObjectInputStream y comprobará su clase si es o no implementes Serializable, Externalizable. En caso afirmativo, continuará o arrojará NonSerializableException.

  • Cómo escribir nuestra propia interfaz marcador

Crear una interfaz sin ningún tipo de método y que es su interfaz de marcador.

Muestra

public interface IMarkerEntity { 


} 

Si cualquier clase que implementan esta interfaz se tomará como entidad de base de datos de la aplicación.

Código de ejemplo:

public boolean save(Object object) throws InvalidEntityException { 
    if(!(object instanceof IMarkerEntity)) { 
     throw new InvalidEntityException("Invalid Entity Found, cannot proceed); 
    } 
    database.save(object); 
} 
  • ¿Es esto posible disponer de métodos de interfaz de marcador?

La idea de Marker Interface Pattern es proporcionar un medio para decir "sí, yo soy algo" y entonces el sistema procederá con el proceso predeterminado, como cuando se marca su clase como Serialzable sólo dice que esta clase puede ser convertido a bytes

+3

Esto debe ser la respuesta –

2

Sí Podemos crear nuestro propio marcador interface..See siguiente ...

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

interfaz de marcador tiene ningún método. Java tiene una interfaz de marcador incorporada como Serializable, Clonable & EventListner etc. que JVM comprende.

Podemos crear nuestra propia interfaz de marcador, pero no tiene nada que ver con JVM, podemos agregar algunos controles con instanceOf.

  1. crear la interfaz vacío

    interface Marker{ } 
    
  2. Escriba una clase e implementa la interfaz

    class A implements Marker { 
        //do some task 
    } 
    
  3. Main clase para comprobar la interfaz de marcador instanceof

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

Es posible que desee prestar más atención, cuando escribes código, porque tu código para el punto 3 tiene varios errores. – Tom

Cuestiones relacionadas