Мене вчили, що інтерфейс Marker на Java - це порожній інтерфейс і використовується для передачі сигналу компілятору або JVM, що до об'єктів класу, що реалізує цей інтерфейс, слід поводитися особливим чином, як серіалізація, клонування тощо.
Але останнім часом я дізнався, що це насправді не має нічого спільного з компілятором чи JVM. Наприклад, в разі Serializableінтерфейсу методу writeObject(Object)з ObjectOutputStreamробить що - щось на зразок instanceOf Serializableвиявляти чи клас реалізує Serializableкидки і NotSerializableExceptionвідповідно. Все обробляється в коді, і це, здається, є схемою дизайну, тому я думаю, що ми можемо визначити власні інтерфейси маркера.
Тепер мої сумніви:
Чи неправильне визначення інтерфейсу маркера, згаданого вище, у першій точці? Як тоді ми можемо визначити інтерфейс Marker?
І замість того, щоб використовувати
instanceOfоператор, чому метод не може бути чимось на зразок,writeObject(Serializable)щоб там була перевірка типу компіляції, а не час виконання?Чим анотації краще інтерфейсів маркера?
Serializableяк Анотація - це нісенітниця, а@NonNullяк Інтерфейс - нісенітниця. Я б сказав: Анотації - це маркери + метадані. BTW: Передвісником анотацій став XDoclet, який народився в Джавадоку, вбитий Анотаціями.