От C++ 11 стандартов, 2.6/ Alternative tokens
:
- Альтернативные маркеры
alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
<% { | and && | and_eq &=
%> } | bitor | | or_eq |=
<: [ | or || | xor_eq ^=
:> ] | xor ^ | not !
%: # | compl ~ | not_eq !=
%:%: ## | bitand & |
Потому что иногда действительно имеет смысл использовать какое-то свойство типа в качестве самого типа - на ум приходит Serializable
. Если я сделаю такой метод:
public void save(Object data){ ... }
... вы действительно не знаете, как эти данные
будут сохранены. Сериализация ВМ? Сериализация свойств bean-компонентов? Какая-то самодельная схема? Тогда как если вы напишете это так:
public void save(Serializable data){ ... }
... это довольно ясно (если бы только разработчик ObjectOutputStream
использовал эту возможность!). Иногда имеет смысл использовать аннотации, когда вы хотите добавить метаданные к типам, но в этом случае я бы поспорил за интерфейс тегов.
Интерфейс тегов обычно связан с неким волшебством: либо непосредственно встроенным в виртуальную машину, либо с использованием отражения. Поскольку магия технически может применяться к любому классу, вы используете теги, чтобы указать, что вы хорошо думаете о магии и применима ли она к вашему классу.
Вопрос об интерфейсах маркеров и аннотациях обсуждается в книге Блоха «Эффективная Java», и часть этого раздела доступна в книгах Google здесь
Он использовался для упоминания некоторого свойства класса (например, Serializable показывает, что классу разрешено сериализоваться). Теперь аннотации могут выполнять эту работу.
В дополнение к другим ответам интерфейсы маркеров также могут использоваться для указания дополнительных свойств класса, который не наследуется другими уже реализованный интерфейс. Одним из примеров этого может быть интерфейс RandomAccess . Он обозначает коллекцию, к которой можно получить произвольный доступ без потери производительности, и к которой не нужно обращаться через итератор для достижения этой производительности.
Вы можете пометить свой класс интерфейсом тегов, чтобы сообщить своему коллеге-разработчику и потребителю вашего класса, что вы явно поддерживаете эту функциональность. Подумайте о Serializable; кто-то, кому нужно сохранить сеанс и для этого использует сериализацию, может безопасно использовать объект вашего класса.
В дальнейшем его можно использовать при отражении; в настоящее время для этого широко используются аннотации, но в былые времена вы могли проверить класс, проверить, реализует ли он определенный интерфейс (например, DAO), и, если да, обработать объект дальше (я думаю об аннотации Entity здесь ).