могу ли я добавить в личный список напрямую через геттер?

StackOverflow https://stackoverflow.com/questions/895257

  •  23-08-2019
  •  | 
  •  

Вопрос

Я понимаю, что меня раскритиковают за то, что я не просто написал тест сам...но мне интересно мнение людей, а не только функциональность, так что...вот оно...

У меня есть класс, у которого есть частный список.Я хочу добавить этот частный список с помощью общедоступного метода getMyList().

так...это сработает?

public class ObA{
 private List<String> foo;
public List<String> getFoo(){return foo;}
}

public class ObB{
   public void dealWithObAFoo(ObA obA){
     obA.getFoo().add("hello");

   }
}
Это было полезно?

Решение

Да, это абсолютно сработает, а это обычно плохо.(Это потому, что вы действительно возвращаете ссылка к объекту коллекции, а не к копии самой коллекции.)

Очень часто требуется предоставить доступ к коллекции по-настоящему только для чтения, что обычно означает возвращение оболочки, доступной только для чтения, вокруг коллекции.Если сделать тип возвращаемого значения доступным только для чтения интерфейсом, реализованным коллекцией, и вернуть фактическую ссылку на коллекцию, это не обеспечит достаточной защиты:вызывающий абонент может легко привести к «настоящему» типу коллекции, а затем без проблем добавить его.

Другие советы

Действительно, не очень хорошая идея.Не публикуйте своих изменяемых участников снаружи, сделайте копию, если вы не можете предоставить версию только для чтения на лету...

public class ObA{
  private List<String> foo;
  public List<String> getFoo(){return Collections.unmodifiableList(foo);}
  public void addString(String value) { foo.add(value); }
}

Если вы хотите узнать мнение об этом, я бы удалил getFoo() позвони и добавь add(String msg) и remove(String msg) методы (или любые другие функции, которые вы хотите предоставить) для ObA

По моему опыту, предоставлять доступ к коллекциям всегда плохо – главным образом потому, что их практически невозможно контролировать, как только они выходят наружу.Я взял за правило НИКОГДА не разрешать прямой доступ к коллекциям за пределами класса, который их содержит.

Основная причина этого заключается в том, что почти всегда к сбору данных привязана какая-то бизнес-логика — например, проверка при добавлении или, возможно, когда-нибудь вам понадобится добавить вторую тесно связанную коллекцию.

Если вы разрешите доступ, как вы говорите, в будущем будет очень сложно внести подобные изменения.

Да, кроме того, я часто обнаруживаю, что мне в конечном итоге приходится хранить немного больше данных с объектом, который я сохраняю, поэтому я создаю новый объект (известный только внутри «Контейнера», в котором находится коллекция) и помещаю объект внутри этого, прежде чем поместить его в коллекцию.

Если вы сохранили свою коллекцию заблокированной, это тривиальный рефакторинг.Попытайтесь представить, насколько сложно было бы в каком-то случае, над которым вы работали, и не держать коллекцию под замком...

Если вы хотите поддерживать функции добавления и удаления в Foo, я бы предложил методы addFoo() и RemoveFoo().В идеале вы могли бы исключить getFoo вместе, создав метод для каждой необходимой вам части функциональности.Это проясняет, какие функции вызывающий абонент будет выполнять в списке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top