Home / Programmazione / Java / Usare il pattern Builder in Java
Mattepuffo

Usare il pattern Builder in Java

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!