Вы нарушаете два правила OO программирования:
- не говорите с незнакомцами
- инкапсуляция
Обратите внимание, что эти правила - просто правилаи что они могут или даже должны иногда нарушаться.
Но если некоторые данные принадлежат объекту, и объект должен гарантировать некоторые инварианты для объектов, которыми он владеет, то он не должен выставлять своиизменяемые внутренние структуры данных наружу.Отсюда необходимость защищенной копии.
Еще одна часто используемая идиома - возвращать неизменяемые представления изменяемых структур данных:
public List<Foo> getFoos() {
return Collections.unmodifiableList(this.foos);
}
Эта идиома, или идиома защитной копии, может быть важнойНапример, если вы должны убедиться, что каждая модификация списка проходит через объект:
public void addFoo(Foo foo) {
this.foos.add(foo);
someListener.fooAsBeenAdded(foo);
}
Если вы не сделаете защитную копию или не вернете неизменяемый вид списка, вызывающая сторона можетдобавьте foo в список напрямую, и слушатель не будет вызван.