2016-02-29 31 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; 
} 

它編譯和運行。任何意見,你能看到這個代碼的任何潛在問題?

謝謝