Разница между интерфейсом маркера и пустым интерфейсом?
Каждый интерфейс Marker - это пустой интерфейс. Верно ли и наоборот?
4 ответа
Каждый интерфейс Marker - это пустой интерфейс. Верно ли и наоборот?
Нету. Пустой интерфейс, который не имеет смысла, не является интерфейсом маркера... в любом полезном смысле. Интерфейс маркера должен обозначать что-то значимое в классе, который его реализует.
И, фактически, согласно некоторым определениям (гибридный) интерфейс маркера может содержать методы (см. Определение Wikipedia ниже). Таким образом, интерфейс маркера не обязательно является пустым интерфейсом.
@Sudheep Vallipoyil говорит в своем ответе.
1) Невозможно создать пользовательский интерфейс маркера.
Я не согласен. Это основано на узком определении "интерфейс маркера", которое не является общепринятым.
В отличие от этого, вот как Википедия определяет "интерфейс маркера" и соответствующий шаблон дизайна.
"Шаблон интерфейса маркера - это шаблон проектирования в информатике, используемый с языками, которые предоставляют информацию о типах во время выполнения для объектов. Он предоставляет средства для связи метаданных с классом, в котором язык не имеет явной поддержки таких метаданных".
"Чтобы использовать этот шаблон, класс реализует интерфейс маркера (также называемый интерфейсом тегирования) и методы, которые взаимодействуют с экземплярами этого класса, проверяют наличие интерфейса. В то время как типичный интерфейс определяет функциональность (в форме объявлений методов) что реализующий класс должен поддерживать, маркерный интерфейс не обязан это делать. Само присутствие такого интерфейса указывает на специфическое поведение со стороны реализующего класса. Гибридные интерфейсы, которые одновременно действуют как маркеры и задают требуемые методы, возможны, но могут запутаться, если неправильно использовать ".
Второе определение Джошуа Блоха гласит:
"Интерфейс маркера - это интерфейс, который не содержит объявления метода, а просто обозначает (или" отмечает ") класс, который реализует интерфейс как имеющий некоторое свойство".
Как вы можете видеть, при обычном принятом использовании термин "маркерный интерфейс" не зарезервирован для интерфейсов, определенных JVM. Любой может определить один.
Смотрите также:
Этот ответ - прокомментировать @Stephen C в своем ответе
1. Вопрос не в том, что такое шаблон интерфейса Marker (это все равно, что спрашивать, что такое итератор и что такое шаблон итератора).
2. Определение вики предназначено для "шаблона дизайна интерфейса маркера", а не для концепции интерфейса маркера в Java
3. из эффективного Java Джошуа вы можете найти следующее определение для маркера интерфейса
"Интерфейс маркера - это интерфейс, который не содержит объявления метода, а просто обозначает (или" отмечает ") класс, который реализует интерфейс как имеющий некоторое свойство".
Он также объяснил, почему Set (сборочный фрейм), который не затрагивает пустой интерфейс, не является интерфейсом Marker.
я не думаю, что ответом должно быть что-то вроде копирования некоторых определений из вики и объяснения того же самого (что также не связано!)
С первого взгляда мы можем вызвать интерфейс как маркерный интерфейс, если он не содержит каких-либо членов и используется для указания JVM о поведении во время выполнения класса реализации. Каждый пустой интерфейс не является интерфейсом маркера, как
1) Невозможно создать пользовательский интерфейс маркера
2) Пустой интерфейс, который вы пишете, может расширять любые другие интерфейсы, которые не являются пустыми (тогда даже пустой интерфейс имеет некоторые унаследованные члены).
Лучше понять, что необходимость использования интерфейса маркера заменяется использованием аннотаций из Java 5.(этим вы можете понять, для чего предназначен интерфейс маркера).
Вы не правы!!! Я не знаю, где вы получаете эту информацию? Из java SE 7 Programmers Study Guide упоминается, что "интерфейс - это общедоступный набор методов, которые должны быть реализованы классом, который использует интерфейс". Интерфейс - это интерфейс, если он изменился, я должен прочитать это в упоминании этого типа книги выше. Если такой интерфейс, как Cloneable, не имеет открытых методов, значит, он не имеет открытых методов, но любой реализующий его класс должен реализовывать Object.clone() как открытый. Вот что это значит!!! Пожалуйста, не превращайте что-то настолько простое в сложную дискуссию, особенно на собеседовании!