Java: шаблон дизайна для постраничных результатов - PullRequest
8 голосов
/ 28 декабря 2010

Так что есть Iterable и Iterator и List.Что вы используете, если вы пытаетесь предоставить интерфейс к другому Java-коду, чтобы инкапсулировать функциональность, предоставляемую удаленной службой, которая возвращает результаты в виде «страниц»?

В качестве примера рассмотрим базу данных или веб-страницу (например, flickr API ).После первого извлечения результатов вы знаете общее количество результатов и первые N результатов, но оставшиеся результаты вы не узнаете, пока не получите остальные.

Ответы [ 3 ]

5 голосов
/ 28 декабря 2010

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

Вы можете предоставить один метод, который возвращаетСписок вроде этого:

List<YourClass>  getResults(int offset, int maxResults)

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

Java Persistence API также следует той же схеме, интерфейс Query предоставляет 3 метода, которые делают выше:

setFirstResult()
setMaxResults()
List getResultList()

http://download.oracle.com/javaee/5/api/javax/persistence/Query.html

3 голосов
/ 05 января 2011

Я бы остался совместимым с Iterator интерфейсом и не вводил бы новые методы (как предложено выше).Вместо этого я бы использовал ленивая загрузка в hasElements(), nextElement() и ваши классовые получатели.

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

В своем приложении я решил реализовать Iterator<ListPage>, где реализация итератора next() заключается в загрузке следующей страницы результатов, а ListPage имеет методы, которые возвращают реальный список и метаданные, например общее количество результатов, # на страницу, номер страницы и общее количество страниц:

public interface ListPage<T> {
    public List<T> getList();
    public int getTotal();
    public int getPage();
    public int getPages();
    public int getPerPage();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...