Вчера я натолкнулся на атрибуты в С#, [Serializable]
чтобы быть точным. Насколько я понимаю, они используются как метаданные, чтобы предоставить некоторую информацию о вашем классе.
Кроме того, я узнал, что Java имеет "интерфейсы маркеров", те, у которых нет методов, которые служат для объяснения класса, то есть маркировки некоторой характеристики класса, например интерфейса Serializable
.
Мне было интересно: можете ли вы сделать параллель между ними? Они похожи или даже одинаковы?
Атрибуты С# больше похожи на аннотации Java. (Я считаю, что, когда Java получила эту идею).
Маркерные интерфейсы представляют собой конструкцию Java 1.0, которые редко используются в новом коде, если вообще когда-либо. Я не считаю их полезными. Я бы не рекомендовал возродить практику.
Интерфейсы Java должны быть предназначены для разделения декларации меток ("что") от реализации ("как"). Они должны быть как чистые виртуальные классы C++, а не атрибуты или аннотации.
Несколько лет назад Java не поддерживал атрибуты. Поэтому, чтобы "пометить" класс или интерфейс, чтобы их можно было проверить во время выполнения, вы должны использовать интерфейсы маркеров, которые в основном представляют собой пустой интерфейс, но вы все равно можете проверить, может ли экземпляр быть выбран в этот интерфейс.
In.NET
интерфейсы маркеров не должны использоваться, кроме случаев специального использования (например, разрешать использование методов расширения), поскольку атрибуты обеспечивают лучший способ маркировать классы (и многое другое) с метаинформацией. То же самое касается Java 5 и новее, где были введены аннотации и их следует использовать.
Marker interfaces:
1) немного легче проверить на использование проверок динамического типа ('obj - IMarker ');
2) позволил в будущем расширять функциональность и расширяемость данных (т.е. Превратить "маркерный" интерфейс в "полный" интерфейс, который фактически объявляет некоторые члены);
3) могут использоваться в ограничениях общего типа;
Attributes:
обеспечивают более четкое разделение метаданных;
позволяют указывать дополнительную информацию через их конструкторы или свойства;
допускать множественное применение к сущности;
являются универсальными с точки зрения применимости к различным типам сущностей, а не только к классам;
Это в значительной степени зависит от конкретной архитектуры приложения и дизайна, целесообразно ли использовать интерфейс маркера или атрибут в конкретном случае.