Как правило, я думаю, что объект должен создавать коллекцию и предоставлять методы для ее манипулирования; добавить / получить / удалить. Следуя этому правилу, вы не должны предоставлять методы для настройки коллекции напрямую. Если для удобства вам нужен такой метод, как setSomeCollection (Collection someCollection), реализация этого метода не должна устанавливать ссылку в объекте, а копировать значения из коллекции параметров метода в коллекцию внутри объекта;
public void setSomeCollection(Collection someCollection) {
this.someCollection.clear();
this.someCollection.addAll(someCollection);
}
Вы должны сделать это, чтобы клиенты вашего API не могли получить доступ к коллекции, которую поддерживает ваш класс. Если они это сделают, они могут манипулировать им без использования объектов вашего класса и нарушать ограничения, которые гарантирует ваш класс.
То же самое верно, если предоставить геттер; Вы должны либо вернуть копию своего внутреннего собрания, либо версию только для чтения. Apache commons-collection и google-collection предоставляют методы для создания неизменяемых оберток вокруг коллекции, а также те, которые поставляются с Java в пакете java.util; java.util.Collections.unmodifiable *.