Публикация коллекций - плохая идея. Хотя инкапсуляция полей важна в любом случае, коллекции еще важнее.
Сама коллекция, как правило, не является предметом, который вас действительно волнует. Таким образом, вызывающая сторона вашего класса не должна быть в состоянии установить, заменить или даже убрать ее (скажем, установить null
). Следует заботиться только о предметах в нем. Если вы позволяете установить экземпляр списка извне, вы рискуете, что несколько экземпляров вашего класса совместно используют один и тот же список. Это будет иметь некоторые неприятные побочные эффекты.
Ваш класс отвечает (как минимум) за создание экземпляра списка, чтобы убедиться, что это выделенный список, а не нулевая ссылка.
Предоставление списка общедоступным получателем фактически похоже на его полное раскрытие. Это минимальная инкапсуляция, которую вы должны делать, фактически она не похожа на инкапсуляцию.
Полная инкапсуляция выполняется только путем выставления элементов как IEnumerable
и обеспечения добавления, удаления, подсчета и подобных операций в отдельных методах или свойствах. Чем больше вам нужно, тем сложнее становится. Это полезно, если вам действительно не нужно много основных операций извне и вы управляете как можно больше в классе.