我想知道创建默认DAO界面而不是为每个类创建自己的界面是否是一个好习惯。
public interface DAO {
public void addItem();
public void updateItem();
public void removeItem();
public Object getItem(int id);
public Object[] getAll();
}
现在我们可以通过多个类实现此接口。当然,这种解决方案在检索数据时有点像向下转换,但我认为它更有效,代码更清晰。这是一个好方法吗?
答案 0 :(得分:6)
这是一种好方法,但使用泛型可以完成至少一项改进:
public interface DAO<T> {
public void addItem(T item);
public void updateItem(T item);
public void removeItem(T item);
public T getItem(int id);
public List<T> getAll();
}
所以现在你不需要任何演员。但无论如何,你必须确保所有的DAO至少都有这些方法。否则会导致更复杂的问题。此外,如果有一些DAO只具有这些方法,那么最终会得到非常紧凑的干净代码,例如:
public interface UserDAO extends DAO<User> {
// And that is basically it :)
}
public class UserDAOImpl implements UserDAO {
// Your implementations here
// ...
}
注意:我已将Object[]
替换为List<T>
而非T[]
,因为在泛型的情况下您无法做到这一点。但这不是缺点,最好使用内置容器。
答案 1 :(得分:2)
没有。遵循以下结构将是干净的。
interface DAO {
void insert();
void update();
Object read(Integer id);
void delete();
}
class DAOImpl implements DAO {
void insert(){}
void update(){}
Object read(Integer id){}
void delete(){}
}
class ItemDAO extends DAOImpl{
public void addItem(Item i){
insert(i);
}
public void updateItem(Item i){
update(i);
}
public void removeItem(Item i){
delete(i);
}
public Object getItem(int id){
read(id);
}
}
答案 2 :(得分:1)
我不会这样做。如果您有一个只能读取的表(或者某些其他模块/程序/等更新它?或者它只是一些您希望手动设置然后忘记的设置?),该怎么办?或者,如果您希望能够从同一个表中获取多个项目(或许您只需要某些东西的ID,而其他东西需要完整的对象),该怎么办?虽然编写起来可能比较容易,但我认为接口的DAO更难以使用。
我也不认为可读性更好。 CarDAO.getItem(123)
告诉你比CarDAO.getCarById(123)
少得多。如果你想通过别的东西获得汽车,那么你不必超载它(是的,你可以在界面上做一些不是那样的东西,但接口的好处甚至更小)。