Укажите порядок для метода DAO

#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? Я отредактировал свой вопрос, чтобы отразить то, что мне нужно. Кстати, спасибо за ваш быстрый ответ.