这个问题是3年前在这里由另一个人提出的,但没有最终答案:指定DAO方法的排序
我的问题是一样的。我有一个类Student和一个实现DAO的StudentDAOImpl类。我该如何告诉我的方法getAll,我希望所有的学生都按名字排序,而又不将调用者耦合到特定的实现。我想知道这样做的几种方法,但是我想知道什么是最佳实践。
非常感谢您的关注。
public class Student{
private int id;
private String name;
public Student() {
}
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;
}
public class Student{}
public interface StudentDao{
public LinkedList<Student> getAll(Student s, StudentSortCriterion sortBy);
}
public class StudentDaoImpl implements StudentDao{
getAll(...){implementation/SQL Statement}
}
从抽象的角度来看,您需要传递信息如何进行排序。可以通过多种方法进行设计,但为了简单起见,可以将排序的属性直接与学生班级联系在一起。那么为什么不为可排序属性定义常量呢?
DAO无论如何都需要对学生班有深入的了解(因为它必须知道如何创建它们),因此它可以响应学生班定义的参数:
class Student {
public static enum SortCriterion {
ID,
NAME
}
// ...
}
Collection<Student> getAll(SortCriterion sortBy, boolean descending) {
switch (sortBy) {
}
}
这样可以将DAO与学生结合在一起(对此没有害处,因为它已经结合了),但是DAO用户不需要知道排序是如何实现的。
但是出于任何正常目的,我宁愿不要DAO工具进行排序。如果无论如何都是getAll()学生,为什么不使用一个简单的普通比较器,也许很好地嵌入到Student中:
class Student {
public static interface Order {
public final static Comparator<Student> ID = new Comparator() {
// implemetation
}
}
}
进行DAO排序的唯一要点是,如果它返回由数据库结果集支持的惰性集合。但是,如果结果集那么大,那为什么还要使用getAll()?
思考点:排序DAO的用例是什么?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句