Capire la logica di questa parte di Codice.

di il
3 risposte

Capire la logica di questa parte di Codice.

Buongiorno .

Di seguito posto una parte di codice di un programma java per la gestione di un Supermercato.
Vorrei capire un paio di punti per me poco chiari.
Il primo riguarda : throws Exception la funzione di questa istruzione la conosco e riguarda le eccezioni .
Segnala il fallimento di un metodo , pero' mi e' poco chiara la logica .
Ditemi se e' giusto il ragionamento .
Se il reparto del supermercato esiste inizializza le variabili Reparto = rep , Nome = art, Quantita = qty e Prezzo = prc altrimenti
visualizza a video ("ERRORE: reparto inesistente");.
Altri due punti poco chiari sono :
Grazie.

this(rep,art,0,0);
return;
e
this("Macelleria","salame",0,0);
return;



CODICE del PROGRAMMA:

class ArticoloInSupermercato{
private String Reparto;
private String Nome;
private float Prezzo;
private long Quantita;


public ArticoloInSupermercato(String rep,String art,long qty,float prc) throws Exception {
if(Supermercato.checkReparto(rep)) {
Reparto=rep;
Nome=art;
Quantita=qty;
Prezzo=prc;

return;
}
else{
throw new Exception("ERRORE: reparto inesistente");
}
}

public ArticoloInSupermercato(String rep,String art) throws Exception{
this(rep,art,0,0);
return;
}

public ArticoloInSupermercato() throws Exception{
this("Macelleria","salame",0,0);
return;
}

public String toString(){
return "prodotto: " + Nome + ", reparto: " + Reparto + ", prezzo: " + Prezzo + ", quantità: " + Quantita;
}

public boolean equals(ArticoloInSupermercato articolo){
if(this.Nome==articolo.Nome && this.Reparto==articolo.Reparto){
return true;
}
else{return false;}
}
}

3 Risposte

  • Re: Capire la logica di questa parte di Codice.

    FabioJ ha scritto:


    Il primo riguarda : throws Exception la funzione di questa istruzione la conosco e riguarda le eccezioni .
    Segnala il fallimento di un metodo , pero' mi e' poco chiara la logica .
    Ditemi se e' giusto il ragionamento .
    Se il reparto del supermercato esiste inizializza le variabili Reparto = rep , Nome = art, Quantita = qty e Prezzo = prc altrimenti
    visualizza a video ("ERRORE: reparto inesistente");.
    Beh, quel costruttore chiaramente non visualizza nulla di per sé. Non so cosa fa di preciso Supermercato.checkReparto ma restituisce un boolean e se false il costruttore si limita solo a lanciare quella Exception. Sarà poi il chiamante (che ha invocato il costruttore) a dover considerare la eccezione in qualche modo.

    FabioJ ha scritto:


    this(rep,art,0,0);
    return;
    e
    this("Macelleria","salame",0,0);
    return;
    La classe ArticoloInSupermercato ha 3 costruttori. Il primo ha la logica completa, mentre gli altri due usano la invocazione this( ...... ) per invocare un altro costruttore della stessa classe.
    E quindi sia il secondo che il terzo costruttore invocano il primo passando degli argomenti.

    Ah, il return; al fondo del costruttore è assolutamente superfluo!

    FabioJ ha scritto:


    
    	public boolean equals(ArticoloInSupermercato articolo){
    		if(this.Nome==articolo.Nome && this.Reparto==articolo.Reparto){
    			return true;
    		}
    		else{return false;}
    	}
    }
    Questo equals è "dubbio" per alcuni motivi: innanzitutto NON è un override del equals() di Object, perché il parametro è ArticoloInSupermercato invece che Object. E poi comunque sta confrontando le stringhe con == che NON va bene, perché se vuoi confrontare il contenuto delle stringhe bisogna usare equals().
    (il == si basa solo sulla "identità" degli oggetti)
  • Re: Capire la logica di questa parte di Codice.

    Grazie per la risposta.
    Cambia qualcosa se tolgo throws Exception da public ArticoloInSupermercato(String rep,String art,long qty,float prc) throws Exception
    e metto system.out.println("ERRORE: reparto inesistente"); ? E' necessario mettere throws Exception ?

    inoltre come faccio a togliere == e mettere equals() su questo if
    if(this.Nome==articolo.Nome && this.Reparto==articolo.Reparto) potrebbe andar bene : if(this.Nome.equals(articolo.Nome) && this.Reparto.equals(articolo.Reparto)) ????
  • Re: Capire la logica di questa parte di Codice.

    FabioJ ha scritto:


    Cambia qualcosa se tolgo throws Exception da public ArticoloInSupermercato(String rep,String art,long qty,float prc) throws Exception
    e metto system.out.println("ERRORE: reparto inesistente"); ? E' necessario mettere throws Exception ?
    La questione è questa: se togli il lancio della eccezione e metti solo un println, succede che il costruttore termina normalmente e quindi il chiamante HA in mano l'oggetto ArticoloInSupermercato che però non è inizializzato correttamente (se è passato nel else, ovviamente non ha assegnato ai campi!).
    Quindi il chiamante si trova con in mano un oggetto in stato non appropriato. La eccezione serve proprio per quello, per far fallire il costruttore e quindi segnalare al chiamante il problema.

    FabioJ ha scritto:


    inoltre come faccio a togliere == e mettere equals() su questo if
    if(this.Nome==articolo.Nome && this.Reparto==articolo.Reparto) potrebbe andar bene : if(this.Nome.equals(articolo.Nome) && this.Reparto.equals(articolo.Reparto)) ????
    if (this.Nome.equals(articolo.Nome) && ............

    ovviamente il Nome del this NON deve essere null, devi assicurartene tu.
Devi accedere o registrarti per scrivere nel forum
3 risposte