Когда нет ничего для реализации в интерфейсах маркера как сериализуемый.. каково использование реализации его?
В более ранних версиях Java Маркерные интерфейсы были единственным способом объявления метаданных о классе. Например, Serializable Marker Interface позволяет автору класса сказать, что его класс будет вести себя корректно при сериализации и десериализации.
В современной Java маркерным интерфейсам нет места. Их можно полностью заменить Аннотациями , что обеспечивает очень гибкую возможность работы с метаданными. Если у вас есть информация о классе, и эта информация никогда не меняется, то аннотации - очень полезный способ ее представления.
Это указывает на то, что класс (и, следовательно, все поля, которые не являются переходными) являются кандидатами на сериализацию. И если вы строите каркас, зависящий от сериализации, вы, конечно, можете написать метод таким образом:
public void registerObject(Serializable obj);
, чтобы ограничить классы, которые вы готовы принять.
Поскольку сериализованный объект должен сохранять совместимость между системами, сериализация является явным проектным решением и, следовательно, требует использования маркерного интерфейса для идентификации таких кандидатов.
Существует также аспект безопасности. Вы не хотите делать все сериализуемым - иначе вы можете случайно выставить (скажем,) пароли или другие конфиденциальные данные с помощью сериализации.
Такие маркерные интерфейсы полезны в том случае, если другой код принимает решение в зависимости от того, реализует ли объект какой-то маркерный интерфейс.
В случае Serializable
, для сериализации полей объектов будет использована рефлексия.
Теперь предпочтение отдается аннотациям, так как они не распространяются на подклассы.
Смотрите Шаблон интерфейса маркера.
Они называются маркерными интерфейсами. И как следует из названия, они отмечают, что какой-то объект доступен для определенного рода операций.
Serializable
означает, что объект, например, доступен для java-сериализации.
Обсуждалось, не следует ли их заменять аннотациями, так как их функции довольно похожи.
Если Вы реализуете интерфейс, то instanceof
будет истинным. Если вам нечего реализовать, то вы можете использовать это для пометки класса с мета-данными, такими как аннотации для Java 1.5 и выше, не заставляя реализующего делать что-либо особенное.
Вы правы, полагая, что пустой интерфейс не влияет на "стандартное" выполнение программы, основанное на проверке / мутация полей и рассылка методов.
Однако интерфейс маркера полезен при использовании в сочетании с отражением: библиотека / метод проверяет (посредством отражения) объект и работает иначе, если его класс реализует интерфейс маркера. Что касается Java5, то здесь очень мало нужды в интерфейсах маркеров - то же средство «маркировки» может быть достигнуто с помощью аннотаций Java, которые (опять же) большая часть их эффекта будет достигнута с помощью кода, основанного на отражении.