Допустимо ли возвращать unmodifiableList или я должен возвращать массив? - PullRequest
19 голосов
/ 02 февраля 2010

У меня есть метод List<Foo> getFoos (), который получает данные с удаленного сервера и возвращает их.

Конечно, пользователь не должен изменять количество элементов списка, потому что он получит данные, не синхронизированные с данными на сервере (и если он хочет изменить количество элементов, у него есть специальные методы, такие как addFoo ()).

Первым подходом было вернуть массив и изменить сигнатуру метода на Foo[] getFoos (). Но в java это более распространено и пользователю удобнее работать с коллекциями, поэтому я изменил подпись на List<Foo> getFoos (). Этот метод всегда возвращает

Collections.unmodifiableList (originalList)

Итак, когда пользователь попытается изменить список, он получит исключение RuntimeException.

Есть ли какие-либо рекомендации по разработке API в подобных случаях?

Ответы [ 5 ]

25 голосов
/ 02 февраля 2010

Collections.unmodifiableList вполне приемлемо и должно быть быстрее (не нужно создавать массив).

Редактирование - с точки зрения дизайна API, вы должны просто прояснить свой JavaDoc! Люди, которые используют метод, не читая его документ, заслуживают удивления: p

2 голосов
/ 02 февраля 2010

Я бы также сказал, что это вполне приемлемо и намного лучше, чем возвращать массив (который некоторые предполагают, следует рассматривать как устаревший тип).Однако если вы хотите быть более откровенным об этом в API, вы можете рассмотреть возможность возврата ImmutableList из Google Collections .

1 голос
/ 02 февраля 2010

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

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

0 голосов
/ 08 марта 2010

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

0 голосов
/ 02 февраля 2010

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

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

...