Supponiamo di avere una mappa che è una variabile membro privata della mia classe A.
Nella stessa classe creo un'istanza di classe B, chiamiamola objB, passando la mappa al costruttore di B.
Ovviamente questo è sbagliato, perché ho fatto trapelare un campo privato a un oggetto di una classe diversa. Quella classe potrebbe in seguito decidere di modificare la mappa passata, cosa che rovinerebbe tutto.
È preferibile 1) passare usando Collections.unmodifiableMap o forse 2) copiandolo? Se c'è un altro approccio migliore, sarei felice di vederlo.
Nel caso in cui la mappa venga modificata in classe A, objB dovrebbe conoscere immediatamente la nuova mappa. E questo significa che dovrei aggiornare la mappa in objB ogni volta che la modifico (ma non se la passo ad una lista non modificabile).
Penso che l'opzione 2 sia migliore, perché in 1) passiamo una raccolta non modificabile a B, e B assume che le collezioni passate siano modificabili.
class A {
Map<String, Integer> map;
public A() {
map = new HashMap<String, Integer>();
B objB = new B(map); //option 1
B objB = new B(Collections.unmodifiableMap(map)); //2
B objB = new B(new HashMap(map)); //3
}
}
class B{
Map<String, Integer> map;
public B(Map<String, Integer> map) {
this.map = map;
}
//use data from the map to do stuff
}