Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Avere più di un costruttore

    Approfitto per chiedere un'altra cosa. Ho un oggetto che viene creato in un certo momento, e poi successivamente aggiornato con ulteriori informazioni. Esempio del costruttore:

    codice:
         public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria, Double prezzoBase, Date dataIns, Date scadenza, Boolean statoAsta, Offerta offertaCorrente, String vincitore, Informazioni info)
    Quando creo l'asta (salvandola sul db MapDB), chiaramente alcune informazioni non le ho. Invece di passare al metodo parametri di default quando creo una nuova asta (per i pametri di cui ancora non so nulla, tipo il vincitore o le informazioni), ho pensato che fosse meglio mettere due costruttori nella classe Asta, uno per quando si crea l'asta e che ha solo i parametri indispensabili, ovvero:

    codice:
         public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria, Double prezzoBase, Date dataIns, Date scadenza, Boolean statoAsta)
    e l'altro che aggiunge tutti gli altri, ovvero quello postato più su.

    Che cosa ne pensate di questa soluzione?

    Inoltre, pensate che forse sto "sovraccaricando" la classe asta di responsabilità, assegnandole tutti quei parametri?
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Che cosa ne pensate di questa soluzione?
    Che può andare bene, non è di per sé sbagliato.
    Non so come li hai scritti esattamente (come corpo) ma dato che hanno dati in comune, sarebbe bene implementare uno dei due come invocazione dell'altro.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Inoltre, pensate che forse sto "sovraccaricando" la classe asta di responsabilità, assegnandole tutti quei parametri?
    Se la classe deve avere tutte quelle informazioni, cioè sono tutte informazioni sensate ed appropriate per una "asta" (non so .. non me ne intendo), allora va bene, ha senso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Questa è la classe completa:

    codice:
    public class Asta implements Serializable {
    
        private static final long serialVersionUID = 6884156563697118688L;
    
        //informazioni inserite all'atto della creazione di una nuova asta
        private int id; //id univoco per ogni asta.
        private String venditore; //l'utente che ha inserito l'asta
        private String nomeOggetto; //il nome dell'oggetto in vendita
        private String descrizione; //la descrizione dell'oggetto in vendita
        private String categoria; //categoria di appartenenza
        private Double prezzoBase; //prezzo di partenza
        private Date dataIns; //data di inserimento dell'asta
        private Date scadenza;
        private Boolean statoAsta; //chiusa o in corso
    
        //informazione inserite successivamente
        private Offerta offertaCorrente; //l'offerta attuale
        private String vincitore; //l'utente che ha vinto l'asta (offerta più alta)
        private Informazioni info; //le domande e le risposte
    
        // Costruttore vuoto per risolvere problema di GWT sulla serializzazione di alcuni tipi
        public Asta() {
        }
    
        //costruttore 1 per quando si crea una nuova asta
        public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria, Double prezzoBase, 
                Date dataIns, Date scadenza, Boolean statoAsta) {
            this.id=id;
            this.venditore=venditore;
            this.nomeOggetto=nomeOggetto;
            this.descrizione=descrizione;
            this.categoria=categoria;
            this.prezzoBase=prezzoBase;
            this.dataIns=dataIns;
            this.scadenza=scadenza;
            this.statoAsta=statoAsta;
        }
    
        //costruttore 2 
        public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria, Double prezzoBase,
                Date dataIns, Date scadenza, Boolean statoAsta, Offerta offertaCorrente, String vincitore, Informazioni info) {
            this.id=id;
            this.venditore=venditore;
            this.nomeOggetto=nomeOggetto;
            this.descrizione=descrizione;
            this.categoria=categoria;
            this.prezzoBase=prezzoBase;
            this.dataIns=dataIns;
            this.scadenza=scadenza;
            this.statoAsta=statoAsta;
        }
    
        public int getId() {
            return id;
        }
    
        public String getVenditore() {
            return venditore;
        }
    
        public String getNomeOggetto() {
            return nomeOggetto;
        }
    
        public String getDescrizione() {
            return descrizione;
        }
    
        public String getCategoria() {
            return categoria;
        }
    
        public Double getPrezzoBase() {
            return prezzoBase;
        }
    
        public Date getDataIns() {
            return dataIns;
        }
    
        public Date getScadenza() {
            return scadenza;
        }
    
        public Boolean getStatoAsta() {
            return statoAsta;
        }
    
        public Offerta getOffertaCorrente() {
            return offertaCorrente;
        }
    
        public String getVincitore() {
            return vincitore;
        }
        
        public Informazioni getInfo() {
            return info;
        }
    
    }
    Che ne pensi? Non ho capito cosa intendi con "sarebbe bene implementare uno dei due come invocazione dell'altro".
    Di fatto una volta che l'asta viene creata (col costruttore 1, diciamo), quelle info di "base" non vengono più modificate, eccetto lo statoAsta che passerà a false alla scadenza, ma verranno semmai aggiunte/aggiornate le altre informazioni, cioè il vincitore, l'offerta corrente e le eventuali informazioni.
    Grazie!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    codice:
        public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria, Double prezzoBase, 
                Date dataIns, Date scadenza, Boolean statoAsta) {
            this.id=id;
            this.venditore=venditore;
            this.nomeOggetto=nomeOggetto;
            this.descrizione=descrizione;
            this.categoria=categoria;
            this.prezzoBase=prezzoBase;
            this.dataIns=dataIns;
            this.scadenza=scadenza;
            this.statoAsta=statoAsta;
        }
    
        public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria, Double prezzoBase,
                Date dataIns, Date scadenza, Boolean statoAsta, Offerta offertaCorrente, String vincitore, Informazioni info) {
            this.id=id;
            this.venditore=venditore;
            this.nomeOggetto=nomeOggetto;
            this.descrizione=descrizione;
            this.categoria=categoria;
            this.prezzoBase=prezzoBase;
            this.dataIns=dataIns;
            this.scadenza=scadenza;
            this.statoAsta=statoAsta;
        }
    Non ho capito cosa intendi con "sarebbe bene implementare uno dei due come invocazione dell'altro".
    Che se guardi ... ci sono evidenti duplicazioni nei due costruttori. Le PUOI evitare implementando uno in funzione dell'altro.

    Tra l'altro nel secondo ... offertaCorrente/vincitore/info che fine fanno?? Non li stai usando!


    Questi sono ad esempio i 7 costruttori di java.awt.Rectangle.

    codice:
    public Rectangle() {
        this(0, 0, 0, 0);
    }
    
    public Rectangle(Rectangle r) {
        this(r.x, r.y, r.width, r.height);
    }
    
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    
    public Rectangle(Point p, Dimension d) {
        this(p.x, p.y, d.width, d.height);
    }
    
    public Rectangle(Point p) {
        this(p.x, p.y, 0, 0);
    }
    
    public Rectangle(Dimension d) {
        this(0, 0, d.width, d.height);
    }

    C'è solo UN costruttore che assegna ai campi. Gli altri 6 sono "in funzione" di quello.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ah sì grazie, avevo dimenticato di aggiungere anche i parametri mancanti.

    Ovviamente con costruttore principale ti riferisci a
    codice:
    public Rectangle(int x, int y, int width, int height)
    ?


    Per cui nel mio caso dovrei avere un costruttore "principale" che assegna tutti i
    campi (cioè il n. 2 della mia classe), e, ad esempio, questo sostituirebbe quello
    che attualment è il n. 1

    codice:
    public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria,
    Double prezzoBase, 
    Date dataIns, Date scadenza, Boolean statoAsta) {
    this(id.id, venditore.venditore, nomeOggetto.nomeOggetto, descrizione.descrizione, 
    dataIns.dataIns, scadenza.scadenza, statoAsta.statoAsta, null, "", null)
    }
    è così oppure non ho capito niente?
    Grazie ancora.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ok mi sa che non ho capito, oppure non so come mettere in pratica la cosa perché come ho scritto nel messaggio precedente vedo che non si può fare. Ma se metto un costruttore 1 (diciamo quello principale) con tutti i campi e l'altro in funzione del primo con solo una parte dei campi, utilizzando quel metodo devo fare una cosa del tipo:

    codice:
         public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria,
                Double prezzoBase, Date dataIns, Date scadenza, Boolean statoAsta) {
                this(0, "", "", "", "", 0.00, null, null, false);
                }
    che però mi dà errore (invocazione ricorsiva di un costruttore) e comunque temo non serva al mio scopo

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    codice:
         public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria,
                Double prezzoBase, Date dataIns, Date scadenza, Boolean statoAsta) {
                this(0, "", "", "", "", 0.00, null, null, false);
                }
    che però mi dà errore (invocazione ricorsiva di un costruttore) e comunque temo non serva al mio scopo
    No, così infatti non ha senso.

    1) nel costruttore che ha più parametri fai gli assegnamenti a tutti i campi.

    2) nel costruttore che ha meno parametri, usi this( ........ ) per chiamare l'altro passando quel minor numero di dati PIÙ dei valori di default.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ok il punto 1) l'ho già fatto, ma non ho capito come fare il punto 2)!

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    non ho capito come fare il punto 2)!
    Se:
    -- un primo costruttore riceve i parametri es. a b c d
    e
    -- un secondo costruttore ha solo i parametri es. a b

    Allora nel secondo fai una invocazione this() passando 4 argomenti: a b E due valori di "default" per c/d del primo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ok non ho avevo capito la sintassi, questa dovrebbe essere quella giusta:

    codice:
        public Asta(int id, String venditore, String nomeOggetto, String descrizione, String categoria, Double prezzoBase, Date dataIns, Date scadenza, Boolean statoAsta) {
            this(id, venditore, nomeOggetto, descrizione, categoria, prezzoBase, dataIns, scadenza, statoAsta, null, "", null);
        }
    Alla fine è utile fino ad un certo punto, cioè non è che si risparmi chissà quanto codice, però come hai detto tu, è sicuramente più elegante.
    Per caso sai qualcosa di GWT? Perché purtroppo quando tento di accedere agli oggetti creati da questa classe (salvati in un db mapDb, di tipo ConcurrentNavigableMap), a runtime, ottengo questo errore:

    Exception while dispatching incoming RPC call
    com.google.gwt.user.client.rpc.SerializationExcept ion: Type 'com.google.asteonlineing.shared.Asta' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = com.google.asteonlineing.shared.Asta@4ade49f4


    Grazie!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.