Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建默认DAO接口_Java_Dao - Fatal编程技术网

Java 创建默认DAO接口

Java 创建默认DAO接口,java,dao,Java,Dao,我想知道创建默认DAO接口而不是为每个类创建自己的接口是否是一个好的实践 public interface DAO { public void addItem(); public void updateItem(); public void removeItem(); public Object getItem(int id); public Object[] getAll(); } 现在我们可以通过多个类来实现这个接口。当然,这种解决方案有它的缺点,

我想知道创建默认DAO接口而不是为每个类创建自己的接口是否是一个好的实践

public interface DAO {

    public void addItem();
    public void updateItem();
    public void removeItem();
    public Object getItem(int id);
    public Object[] getAll();
}

现在我们可以通过多个类来实现这个接口。当然,这种解决方案有它的缺点,比如在检索数据时向下投射,但我认为它仍然更有效,代码更清晰。这是一个好方法吗?

这是一个好方法,但使用泛型至少可以实现一个改进:

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{
公共无效附加项(T项);
公共作废更新项(T项);
公共无效清除项目(T项);
公共获取项(int-id);
公共列表getAll();
}
所以现在你不需要任何铸造。但无论如何,您必须确保所有DAO至少都有这些方法。否则,这将导致更多的复杂性。此外,如果有一些DAO正好包含这些方法,那么您将得到非常紧凑的干净代码,例如:

public interface UserDAO extends DAO<User> {
    // And that is basically it :)
}

public class UserDAOImpl implements UserDAO {
    // Your implementations here
    // ...
}
公共接口UserDAO扩展了DAO{
//基本上就是这样:)
}
公共类UserDAOImpl实现UserDAO{
//您在这里的实现
// ...
}

注意:我已经用
List
替换了
Object[]
,而不是
T[]
,因为在泛型中不能这样做。但这不是缺点,最好使用内置容器。

否。下面的结构将是干净的

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);
   }
}

我不会这么做的。如果您有一个只从中读取的表(可能是其他模块/程序/etc更新了它?或者只是一些设置,您想手动设置一次,然后忘记?)。或者,如果您希望能够从同一个表中获取多个项(可能您只需要某些项的ID,而其他项则需要完整对象),该怎么办?虽然它可能更容易编写,但我认为接口DAO更难使用


我也不认为可读性更好
CarDAO.getItem(123)
告诉您的信息比
CarDAO.getCarById(123)
少得多。如果你想通过其他方式获得汽车,你不必过多地使用它(是的,你可以制作一些界面上没有的东西,但是界面的好处更小)。

不。你刚刚失去了类型安全性。是的,我把数组搞糟了。我不是想在列表上使用数组。