Шаблон интерфейса маркера
Эта статья нуждается в дополнительных цитатах для проверки . ( июнь 2013 г. ) |
Шаблон интерфейса маркера — это шаблон проектирования в информатике , используемый с языками, которые предоставляют информацию о типах объектов во время выполнения. Он предоставляет средства для связи метаданных с классом, если язык не имеет явной поддержки таких метаданных.
Чтобы использовать этот шаблон, класс реализует интерфейс маркера. [ 1 ] (также называемый интерфейсом тегов ), который представляет собой пустой интерфейс, [ 2 ] и методы, которые взаимодействуют с экземплярами этого класса, проверяют существование интерфейса. В то время как типичный интерфейс определяет функциональность (в форме объявлений методов), которую должен поддерживать реализующий класс, интерфейс маркера не обязан этого делать. Само наличие такого интерфейса указывает на специфическое поведение со стороны реализующего класса. Гибридные интерфейсы, которые действуют как маркеры и определяют требуемые методы, возможны, но могут оказаться запутанными при неправильном использовании.
Пример
[ редактировать ]
Примером применения маркерных интерфейсов из языка программирования Java является Serializable
интерфейс:
package java.io;
public interface Serializable {
}
Класс реализует этот интерфейс, чтобы указать, что его непереходные элементы данных могут быть записаны в ObjectOutputStream
. ObjectOutputStream
частный метод writeObject0(Object,boolean)
содержит ряд instanceof
тесты для определения записываемости, один из которых ищет Serializable
интерфейс. Если какой-либо из этих тестов не пройден, метод выдает ошибку NotSerializableException
.
Критика
[ редактировать ]Основная проблема с интерфейсами маркеров заключается в том, что интерфейс определяет контракт для реализации классов, и этот контракт наследуется всеми подклассами. Это означает, что вы не можете «нереализовать» маркер. В приведенном примере, если вы создаете подкласс, который не хотите сериализовать (возможно, потому, что он зависит от переходного состояния), вы должны прибегнуть к явному выбрасыванию NotSerializableException
(за ObjectOutputStream
документы)
Другое решение состоит в том, чтобы язык напрямую поддерживал метаданные :
- И .NET Framework , и Java (начиная с Java 5 (1.5)) обеспечивают поддержку таких метаданных. В .NET они называются «пользовательскими атрибутами» , в Java — « аннотациями » . Несмотря на разное название, концептуально это одно и то же. Они могут быть определены в классах, переменных-членах, методах и параметрах метода, и к ним можно получить доступ с помощью отражения .
- В Python термин «интерфейс маркера» распространен в Zope и Plone . Интерфейсы объявляются как метаданные, и подклассы могут использовать
implementsOnly
заявить, что они не реализуют все из своих суперклассов.
См. также
[ редактировать ]- Дизайнерские маркеры для расширения этого узора.
Ссылки
[ редактировать ]- ^ Блох, Джошуа (2008). «Пункт 37. Используйте интерфейсы маркеров для определения типов» . Эффективная Java (Второе изд.). Аддисон-Уэсли. п. 179 . ISBN 978-0-321-35668-0 .
- ^ «Интерфейс маркера на Java» . Гики для Гиков . 06.03.2017 . Проверено 1 мая 2022 г.
Дальнейшее чтение
[ редактировать ]Эффективная Java [ 1 ] Джошуа Блох .
- ^ Блох, Джошуа (2018). Эффективная Java (Третье изд.). Бостон. ISBN 978-0-13-468599-1 . OCLC 1018432176 .
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )