Agerincolt ha scritto:
Quesiti dal professore:
? Scrivere il metodo Attrezzo getAttrezzo(String nomeAttrezzo)
che restituisca l’attrezzo di nome nomeAttrezzo se esiste, null altrimenti
? Scrivere il metodo String toString()
che restituisca una descrizione della stanza compresa una lista di tutti gli oggetti in essa contenuti
Ho aggiunto qualche commento per farvi capire il problema, spero possiate aiutarmi!
La classe Attrezzo è corretta, cioè non c'è nulla di sbagliato di per sé. Quindi ok.
La classe Stanza invece no, non è corretta/completa e richiede appunto qualche chiarimento e valutazione.
Innanzitutto:
- addAttrezzo è corretto.
- hasAttrezzo è corretto (si potrebbe ottimizzare facendo restituire subito true se trovato, ma NON è affatto quello il punto/problema).
Invece getAttrezzo e toString li devi "capire" e valutare meglio.
Per getAttrezzo hai scritto:
Agerincolt ha scritto:
public Attrezzo getAttrezzo(String nameAttrezzo) {
for(Attrezzo attrezzo : this.attrezzi) {
if(attrezzo.getNome().equals(nameAttrezzo))
return attrezzo;
else
return null;
}
}
A parte la non buona indentazione e il non buon uso delle graffe, si vede che c'è un for principale. Ma ci sono 2 problemi, uno concettuale e l'altro tecnico.
Quello concettuale: se il nome lo trovi restituisci l'attrezzo,
altrimenti (quel else) restituisci null. Quest'ultimo NON ha senso. Se un nome non lo trovi in un attrezzo, non vuol dire nulla subito. Non puoi restituire null, devi andare avanti a cercare.
E il problema tecnico è che il compilatore vede che dopo il for non c'è un return. Il compilatore non può sapere cosa succede a runtime (non sa ovviamente neanche se ci saranno elementi su cui iterare). Quindi vede che il metodo è sguarnito di un return alla fine del for, ed è un errore.
Tutto questo lo risolvi semplicemente così: se trovi il nome restituisci subito l'attrezzo. Altrimenti devi continuare nel ciclo. E solo DOPO la fine del for, allora sai che il nome non è stato trovato e quindi restituisci null. Questo è un problema più di "ragionamento", non c'entra tanto il linguaggio. Avresti avuto lo stesso dubbio/problema in C o un altro linguaggio.
Per il toString hai scritto:
Agerincolt ha scritto:
public String toString() {
return "Stanza: " + this.getNome() + ". Oggetti contenuti: ";
for(Attrezzo attrezzo : this.attrezzi) {
Che non è completo. Ma che è comunque sbagliato. Fai un return e poi dopo un ciclo. Non ha senso.
Se vuoi inserire tutti gli attrezzi nella stringa devi comporre una stringa concatenando tutti i dati. E poi solo alla fine restituire la stringa complessiva.
Oppure usare Arrays.toString se ti basta la forma fornita da questo metodo (che sfrutta il toString dei tuoi oggetti Attrezzo).