2 回答

TA貢獻(xiàn)1842條經(jīng)驗 獲得超22個贊
我的第一個建議是使用 Spring。獲取使用某個接口創(chuàng)建的所有 bean 的列表非常容易。
另外,如果您將 Repository 實例視為一種“插件”,您可能會看到 Java 的 ServiceLoader 類如何提供幫助。
另外,另一種方法是在工廠中使用 switch 語句并為每種情況創(chuàng)建實例,而不是在 Repository 子類上使用靜態(tài)方法。
最后,我不推薦反射解決方案,但有一些方法可以根據(jù)類的名稱加載類并反射性地創(chuàng)建新實例。
但重寫靜態(tài)方法是不可能的。

TA貢獻(xiàn)1934條經(jīng)驗 獲得超2個贊
通過查看您的代碼,我了解到您希望擁有 AbstractBaseRepository 的不同實現(xiàn),例如 DeviceModelRepo。然后你需要一個工廠類來創(chuàng)建AbstractBaseRepository的具體實現(xiàn)的實例。這里的主要問題是您嘗試覆蓋永遠(yuǎn)無法覆蓋的靜態(tài)方法,但子類將隱藏父實現(xiàn)。請不要使用靜態(tài)方法進(jìn)行覆蓋。您可以按如下所示更改您的實施,此問題將得到解決。
public abstract class AbstractBaseRepository {
public AbstractBaseRepository(EntityManagerFactory entityManagerFactory){
...
}
//removed method getNewInstance(EntityManagerFactory entityManagerFactory)
...
}
然后是子類的下面的實現(xiàn)。
public class DeviceModelRepo extends AbstractBaseRepository {
public DeviceModelRepo(EntityManagerFactory entityManagerFactory) {
super(entityManagerFactory);
...
}
//removed method getNewInstance(EntityManagerFactory entityManagerFactory)
...
}
現(xiàn)在我為您提供工廠類的兩個實現(xiàn)。一是每個實現(xiàn)都有不同的方法,例如 getDeviceModelRepository()。另一種解決方案是使用反射并通過傳遞實現(xiàn)存儲庫類來獲取存儲庫實例。
public class RepositoryFactory {
//Solution-1, create separate method for each of repository like below
public static AbstractBaseRepository getDeviceModelRepository() {
return new DeviceModelRepo(entityManagerFactory);
}
//Solution-2, use reflection to get instance of specific implementation
//of AbstractBaseRepository
public static <T extends AbstractBaseRepository> T
getRepository(Class<T> repoClass) throws Exception{
return repoClass.getConstructor(EntityManagerFactory.class)
.newInstance(entityManagerFactory);
}
...
}
使用反射解決方案,您可以獲得存儲庫實例,如下所示。
RepositoryFactory.getRepository(DeviceModelRepo.class)
添加回答
舉報