#java #dao
#java #dao
Вопрос:
Предположим, у меня есть следующий интерфейс DAO:
public interface CountryData {
/**
* Get All Countries.
*
* @return A Collection of Countries.
* @throws DataAccessException Thrown if there is an error communicating with the data store. The Exception's
* Cause Exception can usually be examined to determine the exact nature of the
* error.
* @since 1.0.0
*/
public List<Country> getAll();
}
Далее предположим, что я абстрагирую этот DAO, потому что я мог бы предоставить 2 реализации, одну для базы данных и одну для веб-службы.
Я хочу перегрузить метод GetAll, чтобы принять какой-то параметр упорядочения, чтобы указать, как следует упорядочивать возвращаемое значение.
Однако я не хочу привязывать интерфейс к конкретной реализации. Например, реализация базы данных будет использовать предложение ORDER BY и ей потребуется список столбцов базы данных и направление порядка, такое как «ASC» или «DESC», где реализация веб-службы не будет.
Какова наилучшая практика для предоставления такого параметра без привязки вызывающего объекта к конкретной реализации?
Редактировать
Небольшое уточнение к моему вопросу. Я не просто хочу указать параметр, указывающий направление заказа, но и что заказать.
Например, предположим, что моя модель страны была определена следующим образом:
public final class Country implements Serializable {
private int id;
private String name;
public Country() {
}
public Country(Country countryToCopy) {
this.id = countryToCopy.getId();
this.name = countryToCopy.getName();
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
И я хочу, чтобы возвращаемое значение было упорядочено по имени в порядке возрастания. Я мог бы использовать перечисление, как было предложено, для направления заказа, но как было бы лучше всего указать свойство для заказа, не раскрывая специфику реализации?
Ответ №1:
Либо логическое:
public List<Country> getAll(boolean ascending);
Или перечисление:
enum SortOrder {
ASCENDING,
DESCENDING,
RANDOM,
NONE
}
public List<Country> getAll(SortOrder order);
На самом деле реализация этого не является задачей интерфейса. Просто убедитесь, что любые входные данные, которые принимает интерфейс, могут обрабатываться любым из ваших классов.
Комментарии:
1. Указание направления заказа через ПЕРЕЧИСЛЕНИЕ — это на самом деле то, о чем я думал, но как бы я указал, какие свойства модели заказывать, не будучи специфичным для реализации (например, передать имя столбца базы данных) в DAO? Я отредактировал свой вопрос, чтобы отразить то, что мне нужно. Кстати, спасибо за ваш быстрый ответ.