Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Джошуа Блох: Эффективное Java 2nd Edition, стр. 179

Пункт 37: Использовать интерфейсы маркеров для определения типов

... Вы можете услышать, что он сказал, что маркер аннотации (пункт 35) сделать маркер интерфейсы устарели. Это утверждение неверен. Маркерные интерфейсы имеют два преимущества над маркерными аннотациями. Прежде всего, интерфейсы маркеров определить тип, который реализуется экземпляры отмеченного класса; маркер аннотаций нет. Наличие этот тип позволяет ловить ошибки во время компиляции, что вы не смогли до тех пор, пока вы не используете маркерная аннотация....

Лично я думаю, что я поклоняюсь превосходному знанию Джошуа по этому вопросу.

Ответ 3

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

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

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

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

Ответ 4

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

public void registerObject(Serializable obj);

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

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

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

Ответ 5

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

Serializable означает, что объект имеет право на сериализацию java, например.

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

Внимательно изучите интерфейс маркера в Java, например. Serializable, Clonnable и Remote выглядит так, что они используются для указания компилятора или JVM. Поэтому, если JVM видит, что класс Serializable, он сделал некоторую специальную операцию на нем, аналогично, если JVM видит, что один класс реализует Clonnable, он выполняет некоторую операцию для поддержки клонирования. То же самое верно для RMI и удаленного интерфейса. Итак, вкратце интерфейс Маркера указывает, сигнал или команду на компилятор или JVM.

Подробнее: http://javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html#ixzz2v6fIh1rw