2012-02-22 13 views
8

Uso il pattern Builder per diverse classi del mio progetto (più argomenti, alcuni obbligatori, alcuni facoltativi, ecc.). Queste classi sono immutabili (nessun setter, copia profonda per i getter di raccolta).Builder Pattern and Persistence

Ora sto cercando di memorizzare quegli oggetti in un database utilizzando un framework di persistenza che costruisce oggetti con costruttore + setter predefinito. Non gli piacciono molto i miei Costruttori!

Non voglio degradare tale configurazione ai POJO e perdere i vantaggi del design attuale (flessibilità, immutabilità, sicurezza di costruzione).

Sarei lieto di ricevere qualsiasi feedback su soluzioni alternative che possono essere utilizzate in questa situazione (potrei completare ognuna di queste classi, ma questo raddoppierà il numero di classi e preferirei evitarlo).

Uno post indica effettivamente uno svantaggio specifico del modello di generatore.

EDIT

Una answer propone di utilizzare costruttore privato/setter, ma che funziona solo se i campi della classe non sono definitive, che non è il mio caso.

montaggio finale

Grazie a tutti.
Quello che penso sarà la mia soluzione finale assomiglia a questo e funziona bene (per la cronaca, sto usando MongoDB + Morphia):

class AClass { 
    private final String aField; 
    private final AClass() { 
     aField = ""; 
    } 
    //Standard builder pattern after that - no setters (private or public) 
} 
+4

Non puoi includere setter e costruttore predefinito ma renderli privati? – DaveJohnston

+0

Buona domanda - Controllerò che – assylias

+0

So che Hibernate può usare setter e costruttori privati, mi chiedo solo se hai qualcosa contro questo per il tuo caso specifico. – DaveJohnston

risposta

6

Come ho detto nel mio commento: è possibile includere un costruttore di default e tutti i setter richiesti ma li rendono privati. In questo modo si mantiene l'immutabilità dei propri oggetti ma un ORM come Hibernate sarà in grado di accedere ai metodi/costruttore quando è necessario.

Chiunque sarebbe in grado di accedere a questi metodi utilizzando anche la riflessione, ma poi possono accedere alle variabili membro private utilizzando anche la riflessione. Quindi non c'è un vero svantaggio nell'aggiungere i metodi privati.

+1

Che funziona se i campi non sono definitivi. Ma se lo sono allora non posso usare il costruttore di default/setter privato per ovvi motivi. – assylias

+3

Se il framework di persistenza utilizza la reflection per accedere a un costruttore privato, dovrebbe essere in grado di impostare direttamente i campi delle classi. Funziona anche se i campi sono definitivi. – TDJoe

+1

L'impostazione dei campi su final è ovviamente parte del rendere un oggetto immutabile, ma se non esiste un metodo pubblico per la modifica dell'oggetto, è necessario che i campi siano definitivi? Oltre ad assicurarti di non modificare i valori accidentalmente nei metodi interni alla classe? – DaveJohnston

Problemi correlati