Usare il pattern Builder in Java
Il pattern Builder è uno dei pattern "fondamentali", utilizzato in alternativa all'utilizzo dei costruttori in overloading.
L'obiettivo è quello di rimpiazzare costruttori poco leggibili e poco flessibili, con classi che siano pronte a creare oggetti più complessi.
Oggi ne vediamo un esempio in Java; è solo una delle tante rappresentazioni, ed è un esempio basico dal quale partire.
Quella che useremo è una classe che rappresenta i campi di una tabella, che poi vengono estratti tramite query.
Ecco qua:
public class GenAnag {
private final int npu;
private final String ragsoc;
private final String breve;
private final String via;
private final String cap;
private final String localita;
private final String provincia;
private final String nazione;
private final String codfiscale;
private final String partiva;
public GenAnag(GenAnagBuilder builder) {
this.npu = builder.npu;
this.ragsoc = builder.ragsoc;
this.breve = builder.breve;
this.via = builder.via;
this.cap = builder.cap;
this.localita = builder.localita;
this.provincia = builder.provincia;
this.nazione = builder.nazione;
this.codfiscale = builder.codfiscale;
this.partiva = builder.partiva;
}
public GenAnag() {
GenAnag ga = new GenAnag.GenAnagBuilder().build();
this.npu = ga.getNpu();
this.ragsoc = ga.getRagsoc();
this.breve = ga.getBreve();
this.via = ga.getVia();
this.cap = ga.getCap();
this.localita = ga.getLocalita();
this.provincia = ga.getProvincia();
this.nazione = ga.getNazione();
this.codfiscale = ga.getCodfiscale();
this.partiva = ga.getPartiva();
}
public GenAnag(int npu, String ragsoc, String breve, String via, String cap, String localita, String provincia, String nazione, String codfiscale, String partiva) {
GenAnag ga = new GenAnag.GenAnagBuilder()
.npu(npu)
.ragsoc(ragsoc)
.breve(breve)
.via(via)
.cap(cap)
.localita(localita)
.provincia(provincia)
.nazione(nazione)
.codfiscale(codfiscale)
.partiva(partiva)
.build();
this.npu = ga.getNpu();
this.ragsoc = ga.getRagsoc();
this.breve = ga.getBreve();
this.via = ga.getVia();
this.cap = ga.getCap();
this.localita = ga.getLocalita();
this.provincia = ga.getProvincia();
this.nazione = ga.getNazione();
this.codfiscale = ga.getCodfiscale();
this.partiva = ga.getPartiva();
}
public int getNpu() {
return this.npu;
}
public String getRagsoc() {
return this.ragsoc;
}
public String getBreve() {
return this.breve;
}
public String getVia() {
return this.via;
}
public String getCap() {
return this.cap;
}
public String getLocalita() {
return this.localita;
}
public String getProvincia() {
return this.provincia;
}
public String getNazione() {
return this.nazione;
}
public String getCodfiscale() {
return this.codfiscale;
}
public String getPartiva() {
return this.partiva;
}
public static class GenAnagBuilder {
private int npu;
private String ragsoc;
private String breve;
private String via;
private String cap;
private String localita;
private String provincia;
private String nazione;
private String codfiscale;
private String partiva;
public GenAnagBuilder npu(int npu) {
this.npu = npu;
return this;
}
public GenAnagBuilder ragsoc(String ragsoc) {
this.ragsoc = ragsoc;
return this;
}
public GenAnagBuilder breve(String breve) {
this.breve = breve;
return this;
}
public GenAnagBuilder via(String via) {
this.via = via;
return this;
}
public GenAnagBuilder cap(String cap) {
this.cap = cap;
return this;
}
public GenAnagBuilder localita(String localita) {
this.localita = localita;
return this;
}
public GenAnagBuilder provincia(String provincia) {
this.partiva = provincia;
return this;
}
public GenAnagBuilder nazione(String nazione) {
this.nazione = nazione;
return this;
}
public GenAnagBuilder codfiscale(String codfiscale) {
this.codfiscale = codfiscale;
return this;
}
public GenAnagBuilder partiva(String partiva) {
this.partiva = partiva;
return this;
}
public GenAnag build() {
return new GenAnag(this);
}
}
}
Questo il metodo che esegue la query e riempie un ArrayList:
public class GenAnagQueries {
public ArrayList<GenAnag> getByNpu(int npu) throws ClassNotFoundException, SQLException {
ArrayList<GenAnag> list = new ArrayList<>();
String query = "SELECT * FROM ....................................";
Connection conn = DBManager.getInstance().getConnection();
try (PreparedStatement pstmt = conn.prepareStatement(query)) {
pstmt.setString(1, "XXL");
pstmt.setString(2, " ");
pstmt.setInt(3, npu);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
GenAnag ga = new GenAnag.GenAnagBuilder()
.npu(rs.getInt("NPU"))
.ragsoc(rs.getString("RAGSOC"))
.breve(rs.getString("BREVE"))
.via(rs.getString("VIA"))
.cap(rs.getString("CAP"))
.localita(rs.getString("LOCALITA"))
.provincia(rs.getString("PROVINCIA"))
.nazione(rs.getString("NAZIONE"))
.codfiscale(rs.getString("CODFISCALE"))
.partiva(rs.getString("PARTIVA"))
.build();
list.add(ga);
}
}
return list;
}
}
Devo ancora decidere se è meglio questo, o un classico Bean.
Enjoy!
java pattern builder arraylist bean
Commentami!