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.