Originariamente inviato da onepiece007
Ad esempio aggiungi viene molto semplicemente cosi:
codice:
//Metodo che aggiunge un elemento
public void aggiungi (String nome,String telefono,String fax){
Persona contatto = new Persona(nome,telefono,fax);
contatti.add(contatto);
}
Dal punto di vista concettuale è ancora sbagliato. Anche qui è una questione di "design". Se la tua classe definisce degli "invariant" essi devono essere controllati e rafforzati dall'interno della classe, non dall'esterno.
Un "invariant" è una affermazione che deve essere sempre vera. Una condizione che non deve mai variare.
Nella tua classe Rubrica esiste un invariant molto importante, l'hai definito tu: non ci devono essere elementi Persona con lo stesso nome, in pratica non ci devono essere nomi duplicati.
Questo invariante deve essere garantito dalla classe Rubrica. Ma scrivendo aggiungi() come hai fatto sopra questo non può essere garantito, visto che semplicemente crea l'oggetto Persona e lo aggiunge fregandosene di cosa possa esserci in nome.
Una soluzione migliore è questa:
codice:
public class Rubrica
{
private ArrayList<Persona> contatti = new ArrayList<Persona> ();
// ....
public boolean aggiungi (String nome, String telefono, String fax)
{
if (cercaNome (nome) != null)
return false;
contatti.add (new Persona (nome, telefono, fax));
return true;
}
public Persona cercaNome (String nome)
{
for (Persona persona : contatti)
{
if (persona.getNome ().equals (nome))
return persona;
}
return null;
}
}
Poi lo usi semplicemente così:
codice:
// ... input di nome, telefono, fax ....
if (rubrica.aggiungi (nome, telefono, fax))
System.out.println ("L'utente " + nome + " è stato aggiunto in rubrica");
else
System.out.println ("L'utente " + nome + " non può essere aggiunto perchè già presente in rubrica");
Che tra l'altro in questo modo è anche più snello e "pulito".
Quindi, come vedi, non basta scrivere dei metodi così tanto per fare ma bisogna anche ragionare e pensare in termini di concetti e design.
Adesso ti faccio una domanda: né la tua classe né la mia classe Rubrica sono "thread-safe". Se si volesse rendere la classe Rubrica thread-safe, nella mia sarebbe molto più facile farlo (garantendo sempre l'invariant) rispetto alla tua. Perché? Prova un po' a pensarci.