Sto utilizzando un contenitore eterogeneo simile a this one. Posso mettere e ricevere oggetti dal contenitore con facilità:Iterating over eterogeneous container
Favorites f = new Favorites();
f.putFavorite(String.class, "Java");
String someString = f.getFavorite(String.class);
Ma ci sembra essere un modo semplice per iterare su tale contenitore. Posso aggiungere un metodo keySet()
alla classe Favorites
e semplicemente restituire il set di chiavi del Map
oggetto interno:
public Set<Class<?>> keySet() {
return favorites.keySet();
}
Ora, vorrei scandire le chiavi, utilizzare i tasti per ottenere i valori associati, e chiamare alcuni metodi sugli oggetti ricevuti:
for (Class<?> klass : f.keySet()) {
// f.getFavorite(klass).<SOME_METHOD_SPECIFIC_TO_THE_CLASS-KEY>
}
ho pensato che avrei potuto accedere ai metodi degli oggetti tenuti nel mio contenitore chiamando klass.cast(f.getFavorite(klass)).SOME_METHOD()
, ma non funziona neanche (significato, non posso accedere a qualsiasi metodo, ad eccezione per i metodi basati su Object
).
Diciamo che nel mio caso di utilizzo vorrei esaminare le interfacce di tutti questi oggetti che ho ripetuto e agire di conseguenza nell'interfaccia rilevata. Supponiamo anche che io possa avere dozzine di oggetti di varie classi e che tutti implementino una delle tre interfacce.
L'unica soluzione che posso pensare è di riempire il mio codice con decine di controlli isinstance
, ma preferirei un approccio meno ingombrante (ovvero controllare se un dato oggetto implementa una delle tre interfacce).
Avete un idea dell '"approccio meno ingombrante" che stai immaginando? Voglio dire se hai tre diversi pezzi di codice che vuoi eseguire a seconda che implementi una delle tre diverse interfacce, sembra che qualsiasi approccio che possiamo suggerire dovrà avere tre rami diversi. Quindi sarebbe bello avere chiarezza su ciò che stai trovando proprio macchinoso. –
Scusa, forse non ero abbastanza chiaro. Considero il "controllare se un dato oggetto implementa una delle tre interfacce" approccio per essere meno ingombrante. Almeno se confrontato con lo scenario con dozzine di affermazioni "se". –
Non sono sicuro di dove andremo da 3 se le dichiarazioni a dozzine ... la mia risposta userebbe 3 se le affermazioni, è quello che stai cercando? Il problema con il controllo di tre interfacce in una sola volta è che hai bisogno di fare qualcosa di diverso a seconda di quale delle tre interfacce corrisponde comunque, quindi cosa ti guadagna? –