studio reales proyectos para mentor introducción incluye herramientas fuente desarrollo código con colección avanzado aula aplicaciones interface nservicebus

interface - reales - ¿Para qué sirve una interfaz vacía?



introducción a android studio incluye proyectos reales y el código fuente pdf (11)

Estoy mirando nServiceBus y vine a través de esta interfaz

namespace NServiceBus { public interface IMessage { } }

¿Para qué sirve una interfaz vacía?


En Java Serializable es el ejemplo perfecto para esto. No define ningún método, pero cada clase que "implementa" debe asegurarse de que es realmente serializable y no contiene referencias a cosas que no se pueden serializar, como conexiones de bases de datos, archivos abiertos, etc.


En Java, las interfaces vacías generalmente se usaban para las clases de "etiquetado"; en estos días las anotaciones normalmente se usarían.

Es solo una manera de agregar un poco de metadatos a una clase que dice: "Esta clase es adecuada para <this> tipo de uso" incluso cuando no se involucren miembros comunes.


Las interfaces vacías se utilizan para documentar que las clases que implementan una interfaz determinada tienen un comportamiento determinado

Por ejemplo, en Java, la interfaz Cloneable en Java es una interfaz vacía. Cuando una clase implementa la interfaz Cloneable , sabes que puedes invocar run the clone() en ella.


Normalmente es similar a los atributos. El uso de atributos es preferible a las interfaces vacías (al menos tanto como FxCop sabe). Sin embargo, .NET usa algunas de estas interfaces como IRequiresSessionState e IReadOnlySessionState . Creo que hay una pérdida de rendimiento en la búsqueda de metadatos cuando se usan atributos que los hicieron usar interfaces en su lugar.


Se llaman "Interfaces de marca" y están destinadas a señalar instancias de las clases marcadas.

Por ejemplo ... en C ++ es una práctica común marcar como objetos "ICollectible" para que puedan ser almacenados en colecciones genéricas no tipadas.

Así que, como dice alguien más, deben señalar algún comportamiento soportado por los objetos, como la capacidad de ser recopilados, serializados, etc.



Yo diría que se usa para referencias "futuras" o si quieres compartir algunos objetos, lo que significa que podrías tener 10 clases cada una implementando esta interfaz.

Y enviarlos a una función para trabajar en ellos, pero si la interfaz está vacía, diría que es solo trabajo "pre".


He estado trabajando con NServiceBus durante el año pasado. Si bien no hablaría en nombre de Udi Dahan, entiendo que esta interfaz se usa fundamentalmente como marcador .

Aunque sugiero que le preguntes al hombre si hubiera pensado en dejar esto para una futura extensión. Mi apuesta es no, ya que el mantra parece ser mantener los mensajes muy simples o al menos prácticamente agnósticos de la plataforma.

Otros responden bien en las razones más generales para las interfaces vacías.


Usualmente es para indicar el uso de una clase. Puede implementar IMessage para indicar que su clase es un mensaje. Otro código puede usar la reflexión para ver si los objetos están destinados a ser utilizados como mensajes y actuar en consecuencia.

Esto es algo que se usó mucho en Java antes de tener anotaciones. En .Net es más limpio usar atributos para esto.

@ Stimpy77 Gracias! No lo había pensado de esa manera. Espero que me permita reformular su comentario de una manera más general.

Las anotaciones y atributos deben verificarse en tiempo de ejecución mediante reflexión. Las interfaces vacías se pueden verificar en tiempo de compilación utilizando el sistema de tipos en el compilador. Esto no genera gastos generales en el tiempo de ejecución, por lo que es más rápido.


Una interfaz vacía actúa simplemente como un marcador de posición para un tipo de datos que no se especifica mejor en su comportamiento de interfaz.

En Java, el mecanismo de la extensión de la interfaz representa un buen ejemplo de uso. Por ejemplo, digamos que tenemos lo siguiente

interface one {} interface two {} interface three extends one, two {}

La interfaz tres heredará el comportamiento de ''uno'' y ''dos'', y así

class four implements three { ... }

tiene que especificar los dos métodos, siendo de tipo ''tres''.

Como puede ver, en el ejemplo anterior, la interfaz vacía también se puede ver como un punto de herencia múltiple (no permitido en Java).

Esperando esto ayuda a aclarar con un punto de vista adicional.


Las interfaces vacías se utilizan para marcar la clase, en tiempo de ejecución, la verificación de tipo se puede realizar utilizando las interfaces.

Por ejemplo, una aplicación de interfaces de marcadores del lenguaje de programación Java es la interfaz Serializable. Una clase implementa esta interfaz para indicar que sus miembros de datos no transitorios pueden escribirse en un ObjectOutputStream. El método privado ObjectOutputStream writeObject () contiene una serie de pruebas de instancia para determinar la capacidad de escritura, una de las cuales busca la interfaz Serializable. Si alguna de estas pruebas falla, el método arroja una NotSerializableException.