2009-08-18 9 views

Respuesta

5

Porque a veces, realmente tiene sentido si alguna propiedad de un tipo se puede usar como un tipo en sí mismo - me viene a la mente Serializable. Si hago un método como este:

public void save(Object data){ ... } 

... no se sabe muy bien cómo se salvarán que data. Serialización de VM? Serialización de propiedad de frijol? ¿Algún plan casero? Mientras que si se escribe así:

public void save(Serializable data){ ... } 

... es evidente (aunque sólo el diseñador ObjectOutputStream había usado esta posibilidad!). A veces tiene sentido usar anotaciones cuando quieres agregar metadatos a los tipos, pero en este caso, yo abogaría por una interfaz de etiquetado.

1

Se usó para mencionar algunas propiedades de una clase (como Serializable muestra que la clase puede serializar). Ahora las anotaciones pueden hacer este trabajo.

+0

No, las anotaciones no son un reemplazo para las interfaces de marcador. – skaffman

+1

@skaffman: ¿es algo más difícil que verificar una anotación que una interfaz que te hace decir 'las anotaciones no son un reemplazo para las interfaces de marcador'? –

+0

Se puede anotar código que no sea clases. También se pueden usar anotaciones con argumentos. Tome la anotación de validación JSR 305 '@ ScriptAssert', por ejemplo. –

6

Una interfaz de etiquetado generalmente tiene algo de magia asociada: ya sea directamente integrada en la máquina virtual o mediante reflexión. Debido a que la magia podría aplicarse técnicamente a cualquier clase, usas el etiquetado para indicar que piensas bien sobre la magia y si se aplica a tu clase.

+0

Este es el único juego de interfaz de marcadores de roles. – adatapost

+0

¿Lo es? Me parece que la extensión de una interfaz de etiquetado puede proporcionar comprobación de tipos en tiempo de compilación para los métodos que solo aceptan objetos cuyo tipo es una extensión de la interfaz de etiquetado. Mira EventListenerList.add, por ejemplo. –

6

La cuestión de las interfaces de marcador vs anotaciones se discute en "Effective Java" de Bloch, y parte de esa sección está disponible en Google Books here

+0

+1 - Bloch, como de costumbre, lo resume muy bien y responde mi comentario/pregunta sobre la respuesta de @Mnementh. –

0

Además de las otras interfaces respuestas marcadores también se pueden utilizar para especificar adicional propiedades de una clase que no es heredada por alguna otra interfaz ya implementada. Un ejemplo de esto sería la interfaz RandomAccess. Denota una colección a la que se puede acceder aleatoriamente sin pérdida de rendimiento y no se debe acceder a ella a través de un iterador para lograr ese rendimiento.

0

Puede etiquetar su clase con una interfaz de etiquetado para decirle a su compañero desarrollador y consumidor de su clase que admite explícitamente esa funcionalidad. Piensa en Serializable; alguien que necesita persistir en una sesión y utiliza la serialización para hacer eso, puede usar de forma segura un objeto de su clase.

Se puede utilizar más en la reflexión; hoy en día es común usar anotaciones para hacer esto, pero en los viejos tiempos se puede inspeccionar una clase, verificar si implementa una cierta interfaz (como DAO) y si es así, procesar el objeto más allá (estoy pensando en la anotación de Entidad aquí)

0

las interfaces de marcado son interfaces con el interior no hay métodos abstractos, que se utilizan para añadir un tipo de datos para la clase que los implementa y para ser una interfaz de matriz para otras interfaces (especialmente con la herencia múltiple en las interfaces)

public interface name {} 
public interface john1 {} 
public interface john2 {} 
public interface Demo extends john1 , john2 , name {} 

** cuando JVM ve la interfaz de nombre, se dará cuenta de que la demostración ejercerá un cenario específico.

0

Me gustaría añadir también puede utilizar las interfaces de marcado para restringir la propiedad de una instancia:

interface IFlumThing; 
interface IFlooThing; 

class BaseThing {...} 

class FlumThing extends BaseThing implements IFlumThing {}; 
class FlooThing extends BaseThing implements IFlooThing {}; 

class Flum { 
    addThing(IFlumThing thing){...}; 
} 

class Floo { 
    addThing(IFlooThing thing){...}; 
}