Сравнение атрибутов C # и интерфейсов маркеров Java

1

Вчера я натолкнулся на атрибуты в С#, [Serializable] чтобы быть точным. Насколько я понимаю, они используются как метаданные, чтобы предоставить некоторую информацию о вашем классе.

Кроме того, я узнал, что Java имеет "интерфейсы маркеров", те, у которых нет методов, которые служат для объяснения класса, то есть маркировки некоторой характеристики класса, например интерфейса Serializable.

Мне было интересно: можете ли вы сделать параллель между ними? Они похожи или даже одинаковы?

  • 0
    Я бы сказал, что атрибуты C # похожи на аннотации Java. Интерфейсы маркеров иногда играют роль аннотаций, потому что они существовали до аннотаций.
Теги:
attributes
interface

2 ответа

2
Лучший ответ

Атрибуты С# больше похожи на аннотации Java. (Я считаю, что, когда Java получила эту идею).

Маркерные интерфейсы представляют собой конструкцию Java 1.0, которые редко используются в новом коде, если вообще когда-либо. Я не считаю их полезными. Я бы не рекомендовал возродить практику.

Интерфейсы Java должны быть предназначены для разделения декларации меток ("что") от реализации ("как"). Они должны быть как чистые виртуальные классы C++, а не атрибуты или аннотации.

  • 0
    Хорошо я понял. Спасибо!
2

Несколько лет назад Java не поддерживал атрибуты. Поэтому, чтобы "пометить" класс или интерфейс, чтобы их можно было проверить во время выполнения, вы должны использовать интерфейсы маркеров, которые в основном представляют собой пустой интерфейс, но вы все равно можете проверить, может ли экземпляр быть выбран в этот интерфейс.

In.NET интерфейсы маркеров не должны использоваться, кроме случаев специального использования (например, разрешать использование методов расширения), поскольку атрибуты обеспечивают лучший способ маркировать классы (и многое другое) с метаинформацией. То же самое касается Java 5 и новее, где были введены аннотации и их следует использовать.

Marker interfaces:

1) немного легче проверить на использование проверок динамического типа ('obj - IMarker ');

2) позволил в будущем расширять функциональность и расширяемость данных (т.е. Превратить "маркерный" интерфейс в "полный" интерфейс, который фактически объявляет некоторые члены);

3) могут использоваться в ограничениях общего типа;

Attributes:

обеспечивают более четкое разделение метаданных;

позволяют указывать дополнительную информацию через их конструкторы или свойства;

допускать множественное применение к сущности;

являются универсальными с точки зрения применимости к различным типам сущностей, а не только к классам;

Это в значительной степени зависит от конкретной архитектуры приложения и дизайна, целесообразно ли использовать интерфейс маркера или атрибут в конкретном случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню