Каково использование интерфейсов маркера в Java?

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

51
задан Bill the Lizard 3 January 2010 в 05:55
поделиться

6 ответов

В более ранних версиях Java Маркерные интерфейсы были единственным способом объявления метаданных о классе. Например, Serializable Marker Interface позволяет автору класса сказать, что его класс будет вести себя корректно при сериализации и десериализации.

В современной Java маркерным интерфейсам нет места. Их можно полностью заменить Аннотациями , что обеспечивает очень гибкую возможность работы с метаданными. Если у вас есть информация о классе, и эта информация никогда не меняется, то аннотации - очень полезный способ ее представления.

61
ответ дан 7 November 2019 в 09:46
поделиться

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

public void registerObject(Serializable obj);

, чтобы ограничить классы, которые вы готовы принять.

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

Существует также аспект безопасности. Вы не хотите делать все сериализуемым - иначе вы можете случайно выставить (скажем,) пароли или другие конфиденциальные данные с помощью сериализации.

4
ответ дан 7 November 2019 в 09:46
поделиться

Такие маркерные интерфейсы полезны в том случае, если другой код принимает решение в зависимости от того, реализует ли объект какой-то маркерный интерфейс.

В случае Serializable , для сериализации полей объектов будет использована рефлексия.

Теперь предпочтение отдается аннотациям, так как они не распространяются на подклассы.

Смотрите Шаблон интерфейса маркера.

6
ответ дан 7 November 2019 в 09:46
поделиться

Они называются маркерными интерфейсами. И как следует из названия, они отмечают, что какой-то объект доступен для определенного рода операций.

Serializable означает, что объект, например, доступен для java-сериализации.

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

3
ответ дан 7 November 2019 в 09:46
поделиться

Если Вы реализуете интерфейс, то instanceof будет истинным. Если вам нечего реализовать, то вы можете использовать это для пометки класса с мета-данными, такими как аннотации для Java 1.5 и выше, не заставляя реализующего делать что-либо особенное.

3
ответ дан 7 November 2019 в 09:46
поделиться

Вы правы, полагая, что пустой интерфейс не влияет на "стандартное" выполнение программы, основанное на проверке / мутация полей и рассылка методов.

Однако интерфейс маркера полезен при использовании в сочетании с отражением: библиотека / метод проверяет (посредством отражения) объект и работает иначе, если его класс реализует интерфейс маркера. Что касается Java5, то здесь очень мало нужды в интерфейсах маркеров - то же средство «маркировки» может быть достигнуто с помощью аннотаций Java, которые (опять же) большая часть их эффекта будет достигнута с помощью кода, основанного на отражении.

1
ответ дан 7 November 2019 в 09:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: