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

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

У меня есть класс, у которого есть личный список. Я хочу добавить в этот приватный список через публичный метод 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");

   }
}

Ответы [ 5 ]

4 голосов
/ 22 мая 2009

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

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

2 голосов
/ 22 мая 2009

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

public class ObA{
  private List<String> foo;
  public List<String> getFoo(){return Collections.unmodifiableList(foo);}
  public void addString(String value) { foo.add(value); }
}
1 голос
/ 22 мая 2009

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

1 голос
/ 22 мая 2009

По моему опыту, предоставление доступа к коллекции всегда кажется плохой вещью - в основном потому, что их практически невозможно контролировать после выхода. Я привык никогда не разрешать прямой доступ к коллекциям вне класса, в котором они содержатся.

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

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

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

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

1 голос
/ 22 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...