Ho utilizzato il pattern Builder per creare oggetti con un numero elevato di attributi, in cui la maggior parte di essi è facoltativo. Ma fino ad ora, li ho definiti come finali, come raccomandato da Joshua Block e altri autori, e non ho avuto bisogno di cambiare i loro valori.
Mi chiedo cosa devo fare se ho bisogno di una classe con un numero considerevole di attributi facoltativi ma non definitivi (mutevoli)?
Il codice del pattern di My Builder è simile a questo:
public class Example {
//All possible parameters (optional or not)
private final int param1;
private final int param2;
//Builder class
public static class Builder {
private final int param1; //Required parameters
private int param2 = 0; //Optional parameters - initialized to default
//Builder constructor
public Builder (int param1) {
this.param1 = param1;
}
//Setter-like methods for optional parameters
public Builder param2(int value)
{ param2 = value; return this; }
//build() method
public Example build() {
return new Example(this);
}
}
//Private constructor
private Example(Builder builder) {
param1 = builder.param1;
param2 = builder.param2;
}
}
Posso semplicemente rimuovere la parola chiave final
dalla dichiarazione per poter accedere agli attributi esternamente (tramite setter normali, ad esempio)? Oppure esiste un modello creativo che consente attributi opzionali ma non finali che sarebbero più adatti in questo caso?