Dovresti assolutamente preferire la creazione di un nuovo oggetto nella vasta maggioranza dei casi. Problemi con la riassegnazione di tutte le proprietà:
- Richiede setter pubblici per tutte le proprietà, che limita drasticamente il livello di incapsulamento che puoi fornire
- Sapere se hai un uso aggiuntivo per la vecchia istanza significa che devi sapere ovunque che la vecchia istanza viene utilizzata. Quindi, se la classe
A
e la classe B
sono entrambe istanze passate di classe C
, devono sapere se verranno mai passate la stessa istanza e, in tal caso, se l'altra lo sta ancora utilizzando. Questo raggruppa strettamente classi che altrimenti non avrebbero motivo di essere.
- Porta al codice ripetuto - come indicato da gbjbaanb, se si aggiunge un parametro al costruttore, ovunque che chiama il costruttore non riuscirà a compilare, non c'è pericolo di perdere uno spot. Se aggiungi solo una proprietà pubblica, dovrai accertarti di trovare e aggiornare manualmente ogni luogo in cui gli oggetti sono "ripristinati".
- Aumenta la complessità. Immagina di creare e utilizzare un'istanza della classe in un ciclo. Se si utilizza il metodo, è necessario eseguire l'inizializzazione separata la prima volta attraverso il ciclo o prima dell'avvio del ciclo. In entrambi i casi è un codice aggiuntivo che devi scrivere per supportare questi due modi di inizializzare.
- Indica che la tua classe non può proteggersi dallo stato non valido. Immagina di aver scritto una classe
Fraction
con un numeratore e un denominatore, e volevi far rispettare che era sempre ridotta (cioè il gcd del numeratore e denominatore era 1). Questo è impossibile da fare bene se si desidera consentire alle persone di impostare il numeratore e il denominatore pubblicamente, poiché possono passare attraverso uno stato non valido per passare da uno stato valido a un altro. Per esempio. 1/2 (valido) - > 2/2 (non valido) - > 2/3 (valido).
- Non è affatto idiomatico per la lingua in cui lavori, aumentando l'attrito cognitivo per chiunque mantenga il codice.
Questi sono tutti problemi piuttosto significativi. E ciò che ottieni in cambio del lavoro extra che crei è ... niente. La creazione di istanze di oggetti è, in generale, incredibilmente a buon mercato, quindi il vantaggio in termini di prestazioni sarà quasi sempre del tutto trascurabile.
Come l'altra risposta menzionata, l'unica prestazione in termini di tempo potrebbe essere una preoccupazione rilevante se la tua classe svolge un lavoro di costruzione molto costoso. Ma anche in questo caso, affinché questa tecnica funzioni, dovresti essere in grado di separare la parte costosa dalle proprietà che stai ripristinando, quindi potresti utilizzare modello a peso ridotto o simile.
Come nota a margine, alcuni dei problemi di cui sopra potrebbero essere in qualche modo mitigati non usando setter e invece un metodo public Reset
sulla tua classe che prende gli stessi parametri del costruttore. Se per qualche motivo avresti voluto seguire questa rotta di ripristino, sarebbe probabilmente un modo molto migliore di farlo.
Tuttavia, la complessità aggiuntiva e la ripetizione che aggiunge, insieme ai punti sopra cui non si rivolge, sono ancora un argomento molto persuasivo contro il farlo, specialmente se confrontati con i benefici inesistenti.