2016-02-29 25 views
0

创建DAO比如我有一个类,我相信SI单身,抽象和通用:无法从通用抽象单身

public abstract class GenericDaoImpl<E, K extends Serializable> implements GenericDao<E, K> { 
private static SessionFactory sessionFactory; 
private static ServiceRegistry serviceRegistry; 

private final Class<? extends E> daoType = DaoTypeInit(); 
private static Class<?> DAO; 

public static <T> T getDAO(Class<T> T) throws InstantiationException, IllegalAccessException { 
    if (DAO == null) { 
     Class currentClass = new Object() { }.getClass().getEnclosingClass(); 
     DAO = (Class<?>)currentClass.newInstance(); 
    } 
    return (T) DAO; 
} 

在扩展GenericDaoImpl它似乎无法找到getDAO虽然它是明显存在的子类并继承。

StudentDaoImpl studentDAO = StudentDaoImpl.getDAO(Student.class); 

我在做什么错,谢谢?

+0

你使用的是java 8吗? – Jeff

+0

是的我正在使用Java 8。 –

回答

0

你的问题是,得到道是静态的!

public static <T> T getDAO 

它应该是:

public <T> T getDAO 

否则子类将无法访问,除非他们把它从GenericDaoimpl类。

0

此代码有多个问题,但主要问题是静态方法和变量未继承,new Object() { }.getClass().getEnclosingClass();将始终返回GenericDaoImpl.class。

如果你想要一个懒惰的初始化单例实例,你应该在StudentDaoImpl上声明它。

0

我的代码的当前版本站在这样的:

public abstract class GenericDaoImpl<E, K extends Serializable> implements GenericDao<E, K> { 

private static SessionFactory sessionFactory; 
private static ServiceRegistry serviceRegistry;  

private static final GenericDaoImpl DAO = BuildDAO(GenericDaoImpl.class); 

public static <T extends GenericDaoImpl> T BuildDAO(Class<T> daoClazz) { 
    sessionFactory = buildSessionFactory(); 
    T newDao = null; 
    try { 
     newDao = daoClazz.newInstance(); 
    } 
    catch (InstantiationException | IllegalAccessException ex) { 
     Logger.getLogger(daoClazz.getClass().getName()).log(Level.SEVERE, null, ex); 
    }   
    return newDao; 
} 

它编译和运行。任何意见,你能看到这个代码的任何潜在问题?

谢谢