Chodzi o to, że jeśli pole w Twojej klasie nie jest immutable nie powinieneś zwracać getterem() bezpośrednio tego pola. Ponieważ normalnie mamy sobie jakąś klasę i jeśli chcemy żeby użytkownik mógł zmieniać wartości pól w tej klasie to udostępniamy mu do tego specjalne metody (np. settery). Jeśli nie udostępniamy mu takich metod to znaczy, że nie chcemy aby ingerował w te wartości pól.
Weźmy prostszy przykład:
class ListKeeper {
private List<Integer> list;
// other methods and fields
public List<Integer> getList() {
return list;
}
}
Mamy sobie klasę, która ma w sobie listę intów. Nie chcemy żeby użytkownik tej klasy mógł edytować tą listę, chcemy jedynie aby mógł przeglądać zawarte w niej przedmioty, dlatego udostępniamy mu metodę getList().
Ale co się stało !?
Użytkownik może teraz zrobić coś takiego:
List<Integer> list = new ListKeeper.getList();
list.add(5); // MUHAHAHAHAHA
Niby nie udostępniliśmy mu metody w rodzaju addElement() ani setList(), a jednak podstępny użytkownik i tak nam popsuł naszą listę dodając do niej 5.
Dlaczego?
Ponieważ zwracając: return list; zwróciliśmy bezpośrednią referencję do listy znajdującej się w naszym obiekcie klasy ListKeeper.
Jak temu zapobiec?
Najprościej tak:
public List<Integer> getList() {
return Collections.unmodifiablelist(list);
}
Teraz gdy nasz podstępny gagatek zrobi:
List<Integer> list = ListKeeper.getList();
list.add(5); // WHAT? --> Exception: java.lang.UnsupportedOperationException
I możemy spać spokojnie, bo nikt nie popsuje nam naszej drogocennej listy intów :)