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