Должен ли я инкапсулировать коллекцию также в сеттер? - PullRequest
2 голосов
/ 12 ноября 2011

Должен ли я заменить простой сеттер

public void setCategories(Set<String> categories)
{
    this.categories = categories;
}

с чем-то вроде этого:

public void setCategories(Collection<String> categories)
{
    this.categories.clear();
    if (categories != null)
    {
        this.categories.addAll(categories);
    }
}

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

Set<String> categories = new TreeSet<String>();
categories.add("cityguide");
categories.add("other");
Document document = new Document("http://unique-address.com");
document.setCategories(categories);
System.out.println(categories); //outputs [cityguide, other]
System.out.println(document.getCategories()); //outputs [cityguide, other]
document.setCategories(categories);
categories.add("traveling");
System.out.println(categories); //outputs [cityguide, other, traveling]
System.out.println(document.getCategories()); //outputs [cityguide, other, traveling]

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

да, да, вы должны

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

или удалить идобавьте каждую категорию в цикле

public void setCategories(Collection<String> categories)
{
    for(String cat:this.category.toArray(new String[0])){//using toArray to avoid ConcurrentModificationException
        removeCategory(cat);
    }
    if (categories != null)
    {
        for(String cat:categories){
            addCategory(cat);
        }
    }
}

, чтобы вам не пришлось дублировать триггеры для удаления и / или добавления категории

0 голосов
/ 13 ноября 2011

Итак, все, что вам нужно сделать, это просто добавить коллекцию строк к Document 's categories.

Я просто создам для этого следующие методы:

public void addCategory(String categories){
             this.categories.add(categories);
}

public void addCategory(Collection<String> categories){
         this.categories.addAll(categories);
}

Итак, если я хочу, чтобы набор Document categories больше не изменялся через переданную ссылку на параметр, я буду использовать addCategory().

Если я хочу Documentcategories можно дополнительно изменить с помощью переданной ссылки на параметр, я все еще могу использовать оригинальную setCategories()

...