Методы получения и установки и объекты-контейнеры (ArrayList, HashMap и т. Д.) - PullRequest
3 голосов
/ 19 января 2011

Скажем, у вас есть класс домена, который имеет атрибут ArrayList. Какова лучшая практика при написании методов получения и установки для этого типа экземпляра (чтобы избежать его изменения)?

Ответы [ 8 ]

6 голосов
/ 19 января 2011
public List getList() {
  return Collections.unmodifiableList(list);
}
2 голосов
/ 19 января 2011

Возвращает список, который нельзя изменить, используя метод Collection.unmodifiableList():

Коллекции - Collection.unmodifiableList ()

1 голос
/ 19 января 2011

Используйте класс guava ImmutableList. Ваш получатель должен тогда следовать за формой:

public ImmutableList<T> getMyList() {
  ImmutableList.copyOf(myList);
}

Преимущество guava по сравнению с Collections.unmodifiableList заключается в том, что оно показывает клиенту, что ваше собрание является неизменным в сигнатуре метода, поэтому очень маловероятно, что люди ошибочно попытаются добавить что-либо в коллекцию.

1 голос
/ 19 января 2011

У нас есть соглашение об именах, где

listXXX(); 

дает вам список только для чтения. В дополнение к этому могут быть сеттеры / геттеры с соответствующими модификаторами доступа.

1 голос
/ 19 января 2011

Также рассмотрите возможность создания неизменяемого снимка списка.

public List getList() {
    ArrayList copy = new ArrayList(this.list);
    return Collections.unmodifiableList(copy);
}
1 голос
/ 19 января 2011

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

Если вы отчаянно хотите раскрыть список, тогда есть выбор:

return Collections.unmodifiableList(new ArrayList<Thing>(things));
    // Bit big - shame there isn't a single method and class to do this.

return new ArrayList<Thing>(things);
    // Do you really want to see client code modifying the list?

return Collections.unmodifiableList(things);
    // Client may expecting a snapshot, modifications to the original will mess up.

Обратите внимание, что если элементы списка изменчивы, вы также можете с ними что-то сделать.

1 голос
/ 19 января 2011

Ответ lweller - это то, что я бы сделал в большинстве случаев, но он выдает UnsupportOperationException, с которым вы, возможно, не захотите иметь дело. В этом случае вы можете рассмотреть возможность объявления составного класса, например UnmodifiableList, который содержит List по вашему выбору и предоставляет все методы, которые вы хотите поддерживать, за исключением тех, которые будут изменять список. Это, конечно, больше не будет совместимо по типу с интерфейсом Collection.

1 голос
/ 19 января 2011

Вы можете использовать Collections.unmodifiableList () . Есть эквиваленты для других основных типов коллекций.

...