Qui ci sono tre soluzioni sensate:
- Puoi passarli come parametri al tuo costruttore, il primo parametro è il parametro richiesto, o ..
- Potresti creare getter e setter per fornire questi parametri in seguito, o ..
- Potresti passare una mappa contenente valori di proprietà.
Passaggio al costruttore
Il passaggio al costruttore indica che, mentre facoltativo, devono essere resi noti immediatamente dopo la costruzione dell'istanza. Se questo non è il tuo caso, lo eviterei del tutto poiché A) potresti non avere immediatamente queste informazioni al momento dell'inizializzazione e B) vuoi trasmettere l'uso di una classe nel miglior modo possibile e quindi non c'è motivo di limitare quando non è necessario .
Uso di getter e setter
Per me almeno, l'uso di getter e setter mi dice che stai usando un parametro opzionale. Pertanto, non mi sento obbligato a fornire un valore solo per assicurarmi che ne venga fornito uno. Questo è meglio se questi valori sono veramente opzionali, tuttavia, e l'impostazione predefinita di un parametro funzionerà correttamente. Se pensi che il chiamante preferisca impostarlo su qualcosa (nonostante sia facoltativo), dovresti probabilmente passare al costruttore.
Tieni presente che dovresti essere pronto a utilizzare getter e setter solo se sei disposto a consentire modifiche in qualsiasi punto dell'utilizzo di un'istanza. Con questo voglio dire che dovresti impostare i parametri usando un setter, call execute, quindi modifica tale parametro in un secondo momento e richiama l'esecuzione una seconda volta, dovrebbe funzionare come previsto, utilizzando qualsiasi valore al momento impostato. Se non puoi garantire questo, dovresti non usare getter e setter (usa il passaggio al metodo di costruzione sopra).
Inoltre, per quanto riguarda il tuo vettore di enumerazioni, considera la possibilità di aggiungere un metodo "aggiungi" che prende un singolo valore enum o un vettore e lo aggiunge al suo vettore enum interno. Questo è anche comodo se hai un valore in modo da non dover creare un vettore semplicemente per aggiungere nuovi valori.
Mappa delle proprietà
Una mappa delle proprietà è una buona idea se ti vedi a dover serializzare questi valori su un database o su un file da qualche parte. È anche utile se pensi che le proprietà passate possano variare in modo significativo. Generalmente preferisco evitare questo metodo, tuttavia tendo ad usarlo quando ho a che fare con proprietà che la mia classe non deve avere familiarità con ma sono comunque importanti per le sottoclassi. Un esempio di questo è se dovessi istanziare una connessione al database e non ho bisogno di conoscere tutte le proprietà che possono riguardare quella particolare connessione.
Conclusione
Spero che questo ti dia un inizio. In generale, provo a usare getter e setter per tutti i parametri facoltativi, se possibile. Tutto ciò che deve essere necessario immediatamente dopo la creazione di una nuova istanza (predefinita o meno) deve essere assolutamente nel costruttore.
Puoi anche mescolare e abbinare queste tecniche. Anche l'impressione che do al chiamante a quel punto sarebbe un mix. In altre parole, se inserisco parametri nel costruttore e fornisco anche setter e getter, il messaggio che voglio passare è "Questi parametri dovrebbero essere noti immediatamente perché non hanno impostazioni predefinite adeguate, tuttavia è possibile modificarle in un secondo momento". Se utilizzo la mappa delle proprietà con getter e setter, il messaggio che voglio passare è "Alcuni di questi parametri sono statici e opzionali, mentre altri sono dinamici e possono contenere più informazioni di quelle che questa classe può gestire."
Modifica: non sono sicuro di cosa intendi per updateParameters
. Se tutti questi parametri potrebbero cambiare da un momento all'altro, dovresti prendere in considerazione la creazione di un'istanza completamente nuova ogni volta. Se solo alcuni parametri possono cambiare, allora puoi usare getter e setter e cambiare qualsiasi parametro rispetto a prima.