Oggetto passato come parametro a una funzione

di il
3 risposte

Oggetto passato come parametro a una funzione

Salve la situazione è questa riguardo un app Multithread con GUI :
ho una classe Cliente che ha come fields String nome ,String cognome un costruttore e i vari metodi set e get
ho una classe chiamata Buffer questa contiene come fields una LinkedList<Cliente>() e int capacita e ha come metodi estraiCliente e aggiungiCliente per aggiungere o estrarre dalla coda un cliente.
ECCO IL CODICE:
import java.util.LinkedList;

public class Buffer {

LinkedList<Cliente>coda;
int capacita;
Cliente c;

public Buffer(int capacita, Cliente c) {
coda = new LinkedList<>();
this.capacita = capacita;
this.c = c;
}

public boolean codapiena() {
if(coda.size() >= capacita) {
return true;
}
else
{
return false;
}
}

public Cliente estraiCliente() {
while(coda.isEmpty()) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notifyAll();
return coda.removeFirst();
}

public void aggiungiCliente(Cliente c) {
while(codapiena() == true) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
coda.add(c);
notifyAll();
}

}
La mia domanda era quando io dichiaro nel metodo aggiungiCliente il parametro (Cliente c) cosa sto passando il nome e il cognome della classe Cliente ?
Altra domanda se io dichiaro c di tipo Cliente nella classe Buffer e poi la passo al costruttore cosa sto passando esattamente ha senso farlo?
Ricordo che il punto è aggiungere alla coda un Cliente che inserirò tramite una gui con delle textfields una per il nome e una per il cognome.

3 Risposte

  • Re: Oggetto passato come parametro a una funzione

    Passi un oggetto di tipo Cliente attraverso cui accedere alle sue proprietà. Solitamente le proprietà sono dichiarate private e vi si accede attraverso metodi detti getter e setter.

    Per il discorso del costruttore, quando istanzierai la classe Buffer dovrai farlo passandogli un intero e un oggetto di tipo Cliente. Se poi ha senso dipende dall'uso della classe.


    Non essendo espertissimo spero di no aver detto cose non corrette.

    PS: usa il bottone </> per il codice, altrimenti è poco leggibile.
  • Re: Oggetto passato come parametro a una funzione

    lorenzodev21 ha scritto:


    La mia domanda era quando io dichiaro nel metodo aggiungiCliente il parametro (Cliente c) cosa sto passando il nome e il cognome della classe Cliente ?
    Quando si passa un oggetto ad un metodo, si sta passando una copia del valore del reference all'oggetto. Vuol dire che il metodo chiamato ha in mano lo stesso riferimento che anche il chiamante possiede.

    lorenzodev21 ha scritto:


    Altra domanda se io dichiaro c di tipo Cliente nella classe Buffer e poi la passo al costruttore cosa sto passando esattamente ha senso farlo?
    La classe Buffer non è corretta, per diversi motivi.

    a) I campi andrebbero private.
    b) Il campo Cliente c non ha senso. Non è nemmeno molto chiaro (a me) perché il costruttore deve ricevere un Cliente. L'unico motivo potrebbe essere per creare un buffer con già un cliente. Ma in tal caso allora lo aggiungi subito alla coda ... non ha senso assegnarlo solo al campo c! Consiglio: togli il parametro Cliente del costruttore.
    c) L'uso dei wait/notifyAll (perché volevi il meccanismo "bloccante") è di per sé corretto. Ma per poter usare i wait/notify su un oggetto bisogna acquisire il lock "intrinseco" di quell'oggetto (appunto il this). Quindi quei due metodi DEVONO essere marcati synchronized, altrimenti non ti funziona nulla. E anche il codapiena() deve essere synchronized, per coerenza e per garantire comunque la mutua-esclusione.
    d) Il catch di InterruptedException lì è un po' discutibile. Se avviene InterruptedException è perché "qualcuno" (un altro thread) starebbe cercando di interrompere quel thread bloccato in wait. In tal caso meglio: 1) far uscire fuori InterruptedException, va dichiarato con throws; oppure 2) se dà "fastidio" dover dichiarare InterruptedException che è checked si può lanciare fuori un'altra eccezione unchecked.

    Correggi come appena detto.
  • Re: Oggetto passato come parametro a una funzione

    andbin ha scritto:


    lorenzodev21 ha scritto:


    La mia domanda era quando io dichiaro nel metodo aggiungiCliente il parametro (Cliente c) cosa sto passando il nome e il cognome della classe Cliente ?
    Quando si passa un oggetto ad un metodo, si sta passando una copia del valore del reference all'oggetto. Vuol dire che il metodo chiamato ha in mano lo stesso riferimento che anche il chiamante possiede.

    lorenzodev21 ha scritto:


    Altra domanda se io dichiaro c di tipo Cliente nella classe Buffer e poi la passo al costruttore cosa sto passando esattamente ha senso farlo?
    La classe Buffer non è corretta, per diversi motivi.

    a) I campi andrebbero private.
    b) Il campo Cliente c non ha senso. Non è nemmeno molto chiaro (a me) perché il costruttore deve ricevere un Cliente. L'unico motivo potrebbe essere per creare un buffer con già un cliente. Ma in tal caso allora lo aggiungi subito alla coda ... non ha senso assegnarlo solo al campo c! Consiglio: togli il parametro Cliente del costruttore.
    c) L'uso dei wait/notifyAll (perché volevi il meccanismo "bloccante") è di per sé corretto. Ma per poter usare i wait/notify su un oggetto bisogna acquisire il lock "intrinseco" di quell'oggetto (appunto il this). Quindi quei due metodi DEVONO essere marcati synchronized, altrimenti non ti funziona nulla. E anche il codapiena() deve essere synchronized, per coerenza e per garantire comunque la mutua-esclusione.
    d) Il catch di InterruptedException lì è un po' discutibile. Se avviene InterruptedException è perché "qualcuno" (un altro thread) starebbe cercando di interrompere quel thread bloccato in wait. In tal caso meglio: 1) far uscire fuori InterruptedException, va dichiarato con throws; oppure 2) se dà "fastidio" dover dichiarare InterruptedException che è checked si può lanciare fuori un'altra eccezione unchecked.

    Correggi come appena detto.
    Perfetto grazie codice sistemato tutto chiaro.
Devi accedere o registrarti per scrivere nel forum
3 risposte