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 Serializableinterfaccia del metodo writeObject(Object)di ObjectOutputStreamfa qualcosa di simile instanceOf Serializableper rilevare se gli attrezzi di classe Serializablee getta NotSerializableExceptiondi 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'
instanceOfoperatore, 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?
Serializablecome un'annotazione è una sciocchezza e@NonNullcome un'interfaccia è una sciocchezza. Direi: le annotazioni sono marker + metadati. A proposito: Forefunner of Annotations era XDoclet, nato a Javadoc, ucciso da Annotations.