Il mio programma modella un torneo sportivo che ha uno o più eventi o categorie. La classe Event
ha membri come giocatori o campi come List
, così come alcuni dizionari che usano la classe Map
.
Finora l'accesso pubblico a tali membri può essere fatto attraverso i rispettivi getter, ma ho capito che questa è una cattiva pratica perché consente modifiche attraverso l'oggetto di raccolta recuperato con il getter. E non vorrei questo.
Vorrei limitare il set di operazioni consentite su questi membri ed evitare la situazione descritta sopra.
Si potrebbe pensare che dichiarare questi membri come farebbe final
, ma non è così. Questi membri possono ancora essere modificati, ma invece di farlo liberamente con i metodi nativi List
o Map
, è fatto tramite i metodi delle mie classi.
Quindi supponiamo di bloccare le serie di raccolte consentite su queste raccolte e di creare classi di wrapping per i miei elenchi e le mie mappe, quindi anziché avere questo:
private List<Player> players;
private List<Court> courts;
private Map<Player, List<Timeslot>> playersUnavailable;
Potrei avere qualcosa di simile:
private CustomList<Player> players;
private CustomList<Court> courts;
private CustomMap<Player, List<Timeslot>> playersUnavailable;
Il nome delle classi dovrebbe probabilmente essere diverso, non riesco a pensare a qualcosa di meglio al momento.
Diciamo che vogliamo solo i metodi di lettura per queste classi. Quindi potremmo avere un metodo per ottenere le dimensioni e un altro per ottenere un particolare elemento della collezione interna:
public class CustomList<T> {
private final List<T> list;
public CustomList<T>(List<T> l) { list = l; }
public int size() { return list.size(); }
public int get(int i) { return list.get(i); }
}
Tuttavia, ora non riesco a ripetere gli elementi di una raccolta come normalmente farei:
for (Player player : players)
System.out.println(player);
Anche se potrei usare get()
e size()
ma sembra un po 'rudimentale.
Cosa potrei fare per rendere queste collezioni iterabili mantenendo le regole di immutabilità del mio design? (Come ho detto non è strettamente immutabile, dal momento che puoi farlo usando i metodi pertinenti)
In generale, dovrei ripensare il mio design in modo diverso? Quello che sto cercando di fare ha senso? Potrei ottenerlo in modo diverso, in un modo migliore?
Credo che potrei dire che quello che sto cercando sono raccolte di sola lettura, vero?