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