Mi è stato insegnato che l'interfaccia Marker in Java è un'interfaccia vuota e viene utilizzata per segnalare al compilatore o alla JVM che gli oggetti della classe che implementano questa interfaccia devono essere trattati in un modo speciale, come la serializzazione, la clonazione, ecc.
Ma ultimamente ho imparato che in realtà non ha nulla a che fare con il compilatore o la JVM. Ad esempio, nel caso di Serializable
interfaccia del metodo writeObject(Object)
di ObjectOutputStream
fa qualcosa di simile instanceOf Serializable
per rilevare se gli attrezzi di classe Serializable
e getta NotSerializableException
di conseguenza. Tutto è gestito nel codice e questo sembra essere un modello di progettazione, quindi penso che possiamo definire le nostre interfacce marker.
Ora i miei dubbi:
La definizione di un'interfaccia marker sopra menzionata al 1 ° punto è errata? Come possiamo definire un'interfaccia Marker allora?
E invece di utilizzare l'
instanceOf
operatore, perché il metodo non può essere simile awriteObject(Serializable)
quello in modo che ci sia un controllo del tipo di compilazione anziché il runtime?In che modo le annotazioni sono migliori delle interfacce marker?
Serializable
come un'annotazione è una sciocchezza e@NonNull
come un'interfaccia è una sciocchezza. Direi: le annotazioni sono marker + metadati. A proposito: Forefunner of Annotations era XDoclet, nato a Javadoc, ucciso da Annotations.