Маркерные интерфейсы
Может кто-нибудь, пожалуйста, объясните контракт интерфейсов маркеров в Java?
Например: если Clonable
является интерфейсом маркера без полей / методов, то где clone()
определены?
Почему мы должны реализовать Clonable
I / F всякий раз, когда clone()
используется?
Ну, мой вопрос был, если clone()
это метод java.lang.Object
класс, зачем реализовывать Clonable
I / F переопределить clone()
,
Может ли кто-нибудь рассказать об этом соглашении Java?
Заранее спасибо
6 ответов
clone()
определяется в java.lang.Object
класс, от которого расширяются все классы, однако это protected
, На самом деле это конкретная реализация метода, которая выполняет клонирование объекта по полям, но только если вы реализовали Cloneable
интерфейс, чтобы указать, что это разрешено.
На практике многие люди игнорируют clone()
метод, чтобы они могли сделать это public
и разрешить клонирование извне класса.
Весь этот шаблон довольно необычен и не является чем-то, что вы обычно копируете, я не могу вспомнить многих других примеров в JVM, где есть интерфейс и метод парного маркера. Начиная с Java 5 лучше использовать аннотации для маркеров. например, @XmlRootElement
используется для обозначения типа как сериализуемого Jax-B (после Java 5) против Serializable
Интерфейс (до Java 5), используемый для обозначения класса, является двоичным сериализуемым.
Что такое интерфейс маркера?
Интерфейс, который не содержит какого-либо метода для реализации, называется интерфейсом маркера или тега.
Почему маркерные интерфейсы?
Основная идея наличия маркерных интерфейсов состоит в том, чтобы упомянуть, что класс реализует интерфейс, поведение которого неявно. Класс не должен реализовывать что-либо для соблюдения контракта, определенного интерфейсом. Напротив, это означает, что JVM должна выполнять неявную функциональность.
Пример Java
- Сериализуемый - разрешено сериализовать объекты этого типа. Удаленный. - Этот тип подходит для удаленных вызовов методов. Clonnable - имеет право создавать полевые копии экземпляров.
Можем ли мы создать пользовательские интерфейсы маркеров?
Да, это возможно.
Clonable
не содержит clone()
метод, который защищен в java.lang.Object
,
Более подробная информация доступна здесь
Цитата из Эффективной Java Джоша Блоха:
"Интерфейс Cloneable был задуман как смешанный интерфейс для объектов, объявляющих о том, что они разрешают клонирование. К сожалению, он не подходит для этой цели... Это очень нетипичное использование интерфейсов, а не тот, который нужно эмулировать... Для реализации интерфейс, чтобы иметь какое-либо влияние на класс, он и все его суперклассы должны подчиняться довольно сложному, неисполнимому и в значительной степени недокументированному протоколу "
java.lang.object
класс является супер / родительским классом всех классов Java, если вы хотите создать объект в Java, то он должен быть реализован java.lang.object
учебный класс. Если вы не импортируете суперкласс Object в своем коде, то компилятор неявно импортирует его в ваш код. Поэтому автоматически все его свойства и поведение доступны для вас как объекта (программы), включая метод clone(), если вы вызываете clone() в вашей программе, что означает, что метод clone() вызывается из суперкласса (класса Object), а не из дочернего класса.
Интерфейсы маркеров: настоящие интерфейсы маркеров - это пустой интерфейс, который не содержит свойств и поведения. Теперь вопрос может быть поднят.
В. Кто будет реализовывать интерфейс Predefined Marker, если он используется в нашей программе?
Ответ: JVM возьмет на себя эту ответственность, потому что внутри JVM определена эта функциональность интерфейса Marker, поэтому он реализует и добавляет некоторые дополнительные функциональные возможности для вас программно.
Так что программисту не нужно реализовывать Clonable
Интерфейс маркера, JVM возьмет на себя эту ответственность.
Интерфейс маркера - это общая техника для маркировки классов. Они не добавляют поведение к классам (в целом). Clonable
интерфейс такой тег: каждый класс помечен Clonable
способен клонировать себя (это правило).
То же самое с Serializable
хотя за этим интерфейсом маркеров скрывается еще одна магия (сериализатор объектов ищет некоторые методы и поля, которые тегированный класс может реализовать или нет)
Информация о бонусе: забыть о Clonable
, оно сломано. Если вы хотите создавать клонов в реальной жизни, ищите шаблон конструктора копирования.
Интерфейсы маркеров не имеют никакого тела как такового. Они просто просят Java-интерпретатор вести себя заранее определенным образом для объектов классов, расширяющих их.