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