Vantaggio dell'utilizzo della classe di costruttore interna statica


9

Nel corso della stesura delle linee guida sul codice per un'azienda, mi sono trovato a raccomandare di utilizzare il modello Builder di Effective Java, anziché i costruttori telescopici.

Tuttavia, dopo averci pensato un po 'di più, sicuramente una soluzione più elegante è semplicemente rimuovere la classe builder e rimuovere anche i costruttori extra con argomenti opzionali.

Quindi basta avere l'unico costruttore con i parametri richiesti, getter / setter normali e commentare il codice. Quando si implementa, basta creare una nuova istanza dell'oggetto yr quindi impostare i valori.

Il mio pensiero originale era che il vantaggio derivava dalla rimozione della confusione su quali parametri fossero opzionali e quali fossero richiesti; tuttavia il vero vantaggio deriva dall'uso del metodo di concatenamento / interfaccia fluente.

Il modello del generatore ha vantaggi quando si creano molte nuove istanze in quanto l'ide può fare il lavoro delle gambe e anche se ci sono molti (15+) parametri opzionali. Tuttavia, vale la pena dedicare più tempo alla codifica della classe interna statica, consiglieresti di usare il builder o è una perdita di tempo?


Risposte:


8

Tendo a seguire un modello secondo cui i costruttori dovrebbero fornire tutti i valori obbligatori richiesti per creare un oggetto valido e coerente . Per i valori opzionali, provo a pensare a quale dovrebbe essere il default più comune, in modo che i setter vengano usati il ​​meno possibile.

Se trovo che ci sono molti valori opzionali o che una proporzione maggiore di valori opzionali tende ad essere modificata rispetto ai loro valori predefiniti, allora userò il modello di builder (builder interno statico o altro design simile).

Josh in genere dà un bel consiglio dannatamente buono - la cosa migliore che mi piace di lui è che il consiglio proviene dalle trincee - si ammette di aver commesso errori nella progettazione di parti di Java, e l'effettivo Java è in parte una specie della sua "cura" parla :-)


1
Questo non dice nulla sul perché l'interno dovrebbe essere statico ...
Jimmy Hoffa,

Anche l'immutabilità e gli effetti collaterali sono un obiettivo.
Martijn Verburg,

6

Il modello Builder di Josh Bloch, proprio come il modello BuF di GoF, offre un modo per creare un oggetto immutabile con molti dati predefiniti senza lunghi elenchi di costruttori concatenati.

Se "hai l'unico costruttore con i parametri richiesti, getter / setter normali", il tuo oggetto non è più immutabile. vale a dire. Puoi cambiarlo a lungo dopo averlo istanziato.

Se questo non è un problema per te, non hai mai avuto bisogno del modello Builder in primo luogo. Se si tratta di un problema, la soluzione è difettosa.


Non penso che lo schema del builder abbia qualcosa a che fare con la mutabilità, anche l'esempio gof su wiki è mutabile ... en.wikipedia.org/wiki/Builder_pattern#Java , lo schema ha benefici che ho delineato nella domanda.
NimChimpsky,

3
@NimChimpsky: Non è possibile stabilire se il modello Builder può essere applicato per creare un oggetto mutabile. La domanda è, dovresti? Getter e setter sono stati in giro per l'eternità, dove gli oggetti possono essere mutabili sono una soluzione perfettamente solida, ma le persone hanno incontrato un problema comune con la creazione di oggetti immutabili: catene ingestibili di costruttori. Il costruttore era una soluzione comune e divenne quindi un modello per facilitare la comunicazione.
pdr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.