Меня учили, что интерфейс Marker в Java является пустым интерфейсом и используется, чтобы сигнализировать компилятору или JVM, что объекты класса, реализующие этот интерфейс, должны обрабатываться особым образом, как сериализация, клонирование и т. Д.
Но в последнее время я узнал, что это на самом деле не имеет ничего общего с компилятором или JVM. Например, в случае Serializable
интерфейса метода writeObject(Object)
из ObjectOutputStream
делает что - то вроде instanceOf Serializable
обнаруживать ли класс реализует Serializable
броски и NotSerializableException
соответственно. Все обрабатывается в коде, и это похоже на шаблон дизайна, поэтому я думаю, что мы можем определить наши собственные интерфейсы маркеров.
Теперь мои сомнения:
Является ли определение интерфейса маркера, упомянутое выше в 1-й точке, неправильным? Как мы можем определить интерфейс Маркер тогда?
И вместо того, чтобы использовать
instanceOf
оператор, почему метод не может быть чем-то вродеwriteObject(Serializable)
так, чтобы была проверка типов во время компиляции, а не во время выполнения?Чем аннотации лучше, чем интерфейс маркеров?
Serializable
в качестве аннотации это нонсенс, а@NonNull
в качестве интерфейса - нонсенс. Я бы сказал: аннотации - это маркеры + метаданные. Кстати: предвестником аннотаций был XDoclet, родившийся в Javadoc, убитый аннотациями.