Java DAO фабрика динамически возвращает тип объекта - PullRequest
1 голос
/ 21 июля 2011

Я пытаюсь написать простой DAO, который будет создавать объекты сущностей на основе их типа, хранящегося в поле String. Как вернуть тип, который изменяется динамически? Метод findById () класса UserDAO должен возвращать объект класса User. Тот же метод для ProductDAO должен вернуть Product. Я не хочу реализовывать findById в каждом классе, который расширяет DAO, это должно быть сделано автоматически.

Пример кода:

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

Ответы [ 4 ]

2 голосов
/ 21 июля 2011

Измените его на

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;
}
2 голосов
/ 21 июля 2011

Использование Обобщения в 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...
}
0 голосов
/ 21 июля 2011

Я настоятельно рекомендую вам эту статью, Не повторяйте DAO . И я должен сказать, у вас нет плохой идеи.

0 голосов
/ 21 июля 2011

Во-первых, вместо использования String используйте класс.Далее используйте entityManager (см. документы )

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>();
...