Шаблон интерфейса маркера - Википедия - Marker interface pattern

В шаблон интерфейса маркера это шаблон дизайна в Информатика, используется с языками, которые предоставляют информацию об объектах во время выполнения. Он предоставляет средства для связывания метаданных с классом, в котором язык не имеет явной поддержки таких метаданных.

Чтобы использовать этот шаблон, учебный класс реализует маркер интерфейс[1] (также называемый интерфейс тегов), а методы, которые взаимодействуют с экземплярами этого класса, проверяют наличие интерфейса. В то время как типичный интерфейс определяет функциональные возможности (в форме объявлений методов), которые должен поддерживать реализующий класс, интерфейс маркера не должен этого делать. Само присутствие такого интерфейса указывает на конкретное поведение со стороны реализующего класса. Гибридные интерфейсы, которые действуют как маркеры и определяют необходимые методы, возможны, но могут сбивать с толку при неправильном использовании.

Пример применения маркерных интерфейсов от Язык программирования Java это Сериализуемый интерфейс. Класс реализует этот интерфейс, чтобы указать, что его непреходящий члены данных могут быть записаны в ObjectOutputStream. В ObjectOutputStream частный метод writeObject0 (объект; логическое) содержит серию экземпляр тесты для определения возможности записи, один из которых ищет Сериализуемый интерфейс. Если какой-либо из этих тестов не проходит, метод выдает NotSerializableException.

Критика

Основная проблема с интерфейсами маркеров заключается в том, что интерфейс определяет контракт для реализации классов, и этот контракт наследуется всеми подклассами. Это означает, что вы не можете «не реализовать» маркер. В приведенном примере, если вы создаете подкласс, который не хотите сериализовать (возможно, потому что он зависит от переходного состояния), вы должны прибегнуть к явному выбрасыванию NotSerializableException (на ObjectOutputStream документы)

Другое решение - поддержка языка метаданные напрямую:

  • Оба .NET Framework и Ява (начиная с Java 5 (1.5)) обеспечивают поддержку таких метаданных. В .NET они называются "настраиваемые атрибуты", в Java они называются "аннотации ". Несмотря на разные названия, концептуально это одно и то же. Они могут быть определены в классах, переменных-членах, методах и параметрах методов, и к ним можно получить доступ, используя отражение.
  • В Python термин "интерфейс маркера" распространен в Zope и Plone. Интерфейсы объявлены как метаданные, а подклассы могут использовать инвентарь чтобы заявить, что они не реализуют все из своих суперклассов.

Смотрите также

  • Маркеры дизайна для расширения этого шаблона.
  • Джошуа Блох, «Эффективная Java (Второе издание)», Правило 37: Используйте интерфейсы маркеров для определения типов, стр. 179.

Рекомендации

  1. ^ Блох, Джошуа (2008). «Правило 37: Используйте интерфейсы маркеров для определения типов». Эффективная Java (второе издание). Эддисон-Уэсли. п.179. ISBN  978-0-321-35668-0.