El patrón de interfaz de marcador es un patrón de diseño en informática , utilizado con lenguajes que proporcionan información de tipo en tiempo de ejecución sobre objetos. Proporciona un medio para asociar metadatos con una clase donde el lenguaje no tiene soporte explícito para tales metadatos.
Para usar este patrón, una clase implementa una interfaz de marcador [1] (también llamada interfaz de etiquetado ) y métodos que interactúan con instancias de esa clase prueban la existencia de la interfaz. Mientras que una interfaz típica especifica la funcionalidad (en forma de declaraciones de método) que debe admitir una clase de implementación, una interfaz de marcador no necesita hacerlo. La mera presencia de tal interfaz indica un comportamiento específico por parte de la clase implementadora. Las interfaces híbridas, que actúan como marcadores y especifican los métodos requeridos, son posibles pero pueden resultar confusas si se usan incorrectamente.
Un ejemplo de la aplicación de interfaces de marcadores del lenguaje de programación Java es la Serializable
interfaz. Una clase implementa esta interfaz para indicar que sus miembros de datos no transitorios se pueden escribir en un ObjectOutputStream
. El ObjectOutputStream
método privado writeObject0(Object,boolean)
contiene una serie de instanceof
pruebas para determinar la capacidad de escritura, una de las cuales busca la Serializable
interfaz. Si alguna de estas pruebas falla, el método arroja un NotSerializableException
.
Crítica
Un problema importante con las interfaces de marcador es que una interfaz define un contrato para implementar clases, y ese contrato es heredado por todas las subclases. Esto significa que no puede "anular la implementación" de un marcador. En el ejemplo dado, si crea una subclase que no desea serializar (quizás porque depende del estado transitorio), debe recurrir a lanzar explícitamente NotSerializableException
(por ObjectOutputStream
documentos)
Otra solución es que el lenguaje admita metadatos directamente:
- Tanto .NET Framework como Java (a partir de Java 5 (1.5)) brindan soporte para dichos metadatos. En .NET, se denominan "atributos personalizados" , en Java se denominan " anotaciones " . A pesar del nombre diferente, conceptualmente son lo mismo. Se pueden definir en clases, variables miembro, métodos y parámetros de método y se puede acceder a ellos mediante la reflexión .
- En Python , el término "interfaz de marcador" es común en Zope y Plone . Las interfaces se declaran como metadatos y las subclases se pueden usar
implementsOnly
para declarar que no implementan todo lo de sus superclases.
Ver también
- Marcadores de diseño para una expansión de este patrón.
- Joshua Bloch, "Eficaz Java (segunda edición)", artículo 37: Utilice interfaces de marcador para definir tipos, página 179.
Referencias
- ^ Bloch, Joshua (2008). "Ítem 37: Usar interfaces de marcador para definir tipos" . Eficaz Java (segunda edición) . Addison-Wesley. pag. 179 . ISBN 978-0-321-35668-0.