我正在尝试编写简单的DAO,它将根据存储在String字段中的类型创建实体对象。如何返回动态更改的类型? UserDAO类的方法findById()应返回User类对象。 ProductDAO的相同方法应返回Product。 我不想在扩展DAO的每个类中实现findById,它应该自动完成。
示例代码:
class DAO {
protected String entityClass = "";
public (???) findById(int id) {
// some DB query
return (???)EntityFromDatabase; // how to do this?
}
}
class UserDAO extends DAO {
protected String entityClass = "User";
}
class ProductDAO extends DAO {
protected String entityClass = "Product";
}
class User extends Entity {
public int id;
public String name;
}
答案 0 :(得分:2)
将其修改为
class DAO<T> {
// protected String entityClass = "";
public T findById(int id) {
return (T)EntityFromDatabase; // how to do this?
}
}
class UserDAO extends DAO<User> {
//protected String entityClass = "User";
}
class ProductDAO extends DAO<Product> {
//protected String entityClass = "Product";
}
class User extends Entity {
public int id;
public String name;
}
答案 1 :(得分:2)
使用Generics in java。在这里找一个例子。
public interface GenericDAO<T,PK extends Serializable> {
PK create(T entity);
T read(PK id);
void update(T entity);
void delete(T entity);
}
public class GenericDAOImpl<T,PK extends Serializable> implements GenericDAO<T,PK>{
private Class<T> entityType;
public GenericDAOImpl(Class<T> entityType){
this.entityType = entityType;
}
//Other impl methods here...
}
答案 2 :(得分:0)
首先,不要使用String
,而是使用该类。接下来,使用entityManager
(请参阅docs)
class DAO<T> {
private Class<T> entityClass;
// How you get one of these depends on the framework.
private EntityManager entityManager;
public T findById(int id) {
return em.find(entityClass, id);
}
}
现在,您可以根据类型使用不同的DAO
,例如
DAO<User> userDAO = new DAO<User>();
DAO<Product> userDAO = new DAO<Product>();
答案 3 :(得分:0)
我强烈推荐你这篇文章Don't Repeat the DAO。我必须说,你的想法并不是很糟糕。