Рубрики
Без рубрики

Немного об интерфейсах маркеров в Java

Еще раз здравствуйте! На этот раз я хотел бы поговорить об интерфейсах маркеров в Java. У каждого разработчика Java есть… С тегами java, новички, учебник, архитектура.

Еще раз здравствуйте! На этот раз я хотел бы поговорить об интерфейсах маркеров в Java. Каждый разработчик Java видел их, хотя не все знают, что для этого типа интерфейсов существует специальное слово. В этом посте я хотел бы сосредоточиться на следующих моментах: что такое интерфейс маркера, какие встроенные интерфейсы маркера у нас есть и как они сравниваются с другой концепцией – аннотациями.

Что такое интерфейс маркера?

По сути, интерфейсы маркеров пусты, в них нет методов или полей (например, констант). Мы используем их для предоставления информации об объекте во время выполнения. В качестве примера позвольте мне взять встроенный интерфейс маркера java.lang. Поддающийся клонированию . Он не клонирует сам класс, хотя существует метод Object.clone() , который наследует каждый класс Java. Но с помощью клонируемого интерфейса мы указываем, что класс реализует логику клонирования, и это законно называть clone() метод для создания копии экземпляров этого класса “поле за полем”. В противном случае вызов метода clone() класса, который не реализует Cloneable, приведет к возникновению исключения CloneNotSupportedException . Давайте сначала взглянем на встроенные интерфейсы маркеров в Java.

Встроенные интерфейсы маркеров в Java

Java предоставляет нам 3 встроенных интерфейса маркеров:

  • java.lang. Клонируемый
  • java.io . Сериализуемый
  • ява.rmi. Дистанционный

Вы можете следовать Javadoc для этих интерфейсов и быть уверенными, что они идеально соответствуют вышеупомянутому определению интерфейса маркера. Итак, мы уже говорили в предыдущем разделе о клонируемом интерфейсе. Давайте бегло взглянем на остальные интерфейсы.

java.io . Сериализуемый используется для того, чтобы сделать объекты сериализуемыми. Сериализация – это запись объекта Java в виде последовательности байтов и чтение этих объектов из потока байтов. Он реализуется через ObjectOutputStream для записи (или сериализации) и через ObjectInputStream для чтения (или десерализации). Поэтому для того, чтобы сделать класс сериализуемым , нам нужно реализовать этот интерфейс маркера. В противном случае мы можем получить Исключение NotSerializableException при вызове, например, ObjectOutputStream.writeObject() . Кстати, все дочерние классы (подклассы) сериализуемого класса также сериализуемы (мы поговорим об этом в momemt).

ява.rmi. Удаленный немного сложнее и встречается редко, но все же имеет смысл кратко рассказать об этом здесь. Этот интерфейс используется для идентификации интерфейсов, методы которых могут быть вызваны с нелокальной виртуальной машины. Любой объект, являющийся удаленным объектом, должен прямо или косвенно реализовывать этот интерфейс. Только те методы, которые указаны в удаленном интерфейсе (это интерфейс, расширяющий java.rmi. Удаленные) доступны удаленно. Вы можете прочитать больше об удаленных интерфейсах в этом хорошем руководстве Oracle по проектированию удаленных интерфейсов .

Также в Java есть еще одна концепция, которая может показаться похожей – аннотации . В следующем разделе давайте рассмотрим, в чем разница между аннотациями и интерфейсами маркеров.

Интерфейсы маркеров против аннотаций

Аннотации Java могут показаться похожими на интерфейсы маркеров, поскольку они позволяют нам делать то же самое. Мы можем применить аннотацию к любому классу, чтобы указать, что он может быть использован в определенной логике. И иногда раздается сильный голос за то, чтобы вообще отказаться от интерфейсов маркеров и переключиться на аннотации. Но похожи ли они на 100%? Рассмотрим следующий фрагмент кода:

class Document implements Serializable{

    //..some fields
}

Таким образом, мы делаем наш документ сериализуемым и можем записывать/читать его с помощью сериализации, как мы говорили ранее. Но давайте подумаем, не составим ли мы несколько конкретных документов:

class Spreadsheet extends Document{}

class Diagram extends Document{}

//...

Что, если мы не хотим делать диаграммы сериализуемыми? Но мы не можем в этой конфигурации. Интерфейсы маркеров следуют логике полиморфизма, и поэтому все дочерние элементы сериализуемого класса также сериализуемы. Другая логика была бы, если бы мы использовали образец @Сериализуемый вместо аннотации:

class Document{}

@Serializable
class Spreadsheet extends Document{}

class Diagram extends Document{}

Кстати Документ также может быть интерфейсом маркера, но мы поговорим об этом в последующих сообщениях.

Вывод

В этом коротком посте мы обсудили интерфейсы маркеров: что это такое, что такое встроенные интерфейсы маркеров и в чем разница между ними и аннотациями. Все разработчики Java в той или иной степени сталкивались с маркерными интерфейсами, но не все обращают внимание на то, что на самом деле это отдельный шаблон. Надеюсь, эта короткая статья заставила вас больше заинтересоваться этой концепцией. Вы также можете прочитать оригинальную версию этого поста об интерфейсах маркеров в Java в моем блоге. Хорошего дня!

Рекомендации

  • Гаурав Миглани. Интерфейсы маркеров в Java . Придурки, забытые придурки. Читайте здесь
  • Майнак Госвами. Есть ли лучший подход к маркеру? (2012). Дзон. Читайте здесь

Оригинал: “https://dev.to/iuriimednikov/a-bit-about-marker-interfaces-in-java-b1e”