Non c'è una vera ragione: puoi lavorare con le mappe hash invece delle classi e talvolta ha perfettamente senso. Tendo ad usare gli hash anziché le classi per uno dei seguenti casi:
- Tutti i valori sono dello stesso tipo (stringa)
- Non ho mai direttamente o individualmente referenziato i valori nel codice.
- Strumenti (come le cose menzionate nella domanda)
Il vantaggio che una mappa ha su una classe è che è molto facile gestire genericamente un record alla volta. Una volta inseriti i valori in una classe, si tende a fare riferimento ai valori per nome, rendendo più difficile l'iterazione su di essi.
L'alternativa comune agli Hash in questo spazio problema è Java Beans. I fagioli sono una classe con proprietà e setter / getter per ogni proprietà. Alcune persone chiamano questi pojos, ma i pojos non hanno restrizioni, quindi se la tua classe è destinata ad avere solo setter & i getter chiamano un bean, non un pojo.
Sia i bean che le mappe sono esempi dei fantastici "dati stupidi" di Michael Brown, e questo è un problema separato dalla scelta di utilizzare Maps o Beans.
Ci sono due grossi problemi con "Dumb Data" di entrambi gli aromi, il primo è che hai bisogno di metadati per sapere come usarlo (ad esempio come associarlo a un controllo della GUI o al nome di una colonna di database o convalide)
Con le mappe devi risolvere il problema dei meta-dati con alcuni file di dati esterni - XML o file di configurazione o qualcosa del genere - puoi intuire molto di ciò che vuoi sapere (ad esempio assumendo il nome della colonna nelle corrispondenze DB il nome della chiave nella mappa) ma ho sempre bisogno di alcuni dati.
Con i fagioli è spuntata una soluzione accurata - annotazioni.
Un bean annotato può funzionare come una mappa poiché non si accede direttamente alle variabili per nome, si esegue semplicemente un'iterazione sui campi annotati. Anche i fagioli annotati offrono un miglioramento perché le annotazioni definiscono in linea tutti i metadati anziché richiedere una descrizione separata. Questo è il modo in cui la maggior parte degli strumenti ORM funziona attualmente, ma puoi creare e utilizzare le tue annotazioni abbastanza facilmente.
Il secondo problema è più difficile però - è che i dati sono separati dal codice - non è possibile aggiungere metodi commerciali a un HashMap o un bean. Ciò significa che non sono oggetti, sono entrambi più simili a strutture di dati. Romperanno TUTTO il tuo codice OO / design se li usi direttamente - e lo romperanno in modi davvero infetti e difficili da risolvere.
Normalmente con il codice OO non devi chiedere al tuo oggetto dati, chiedi al tuo oggetto di fare qualcosa con i suoi dati per te. Come diavolo fai questo lavoro con "dati stupidi"?
Ultimamente la mia soluzione è che qualsiasi "Dumb data" usato direttamente dal mio codice ha una classe "Helper". Appena lo tiro dal DB (o dovunque) lo incapsula nella sua classe helper e non lo espongo mai al resto della mia base di codice. qualsiasi codice che accede al bean deve passare attraverso la classe helper, qualsiasi metodo per leggere / modificare / comprendere i dati nel bean viene inserito nell'helper. Nota che non sto parlando di getter e setter: evitali laddove possibile, sono comunque casi di "Chiedere i dati dell'oggetto".
Dopo aver aggiunto questo helper, diventa ovvio dove mettere un sacco di codice che hai usato per distribuire nel resto della tua base di codice (spesso duplicato). Ora chiedi alla classe helper di fare qualcosa, interagisce con il bean per farlo.
Ho persino avuto wrapper separati che implementano la logica di business sul server e la logica / le convalide della GUI sul client, ciascuna contenente gli stessi "dati stupidi".
Penso che la distinzione più importante non sia tra Maps e Bean, sia tra Classi e Dati stupidi. Una volta che i tuoi dati stupidi sono incapsulati in una classe, la sua effettiva implementazione (Bean, Hash, ???) non è nemmeno molto interessante ...