[英]How to get object type in runtime?
我正在嘗試創建一個類,該類負責管理應用程序的所有數據庫訪問,控制具有所有受保護方法的DAO對象的API。 由於我是巴西人,所以某些標識符使用葡萄牙語,無論如何,我認為您將能夠理解那里的情況。以下是代碼:
public class DatabaseManager {
private ItemExpansivelDataSource itemExpansivelDataSource;
private ConfiguracoesDashboardDataSource configuracoesDashboardDataSource;
private PranchaDataSource pranchaDataSource;
private PranchaRaizDataSource pranchaRaizDataSource;
private HashMap<Class<?>, DataSource<?>> dataSourcesMap;
public DatabaseManager() {
super();
this.dataSourcesMap = new HashMap<Class<?>, DataSource<?>>();
dataSourcesMap.put(ItemExpansivel.class, itemExpansivelDataSource);
dataSourcesMap.put(ConfiguracoesDashboard.class, itemExpansivelDataSource);
dataSourcesMap.put(Prancha.class, itemExpansivelDataSource);
dataSourcesMap.put(PranchaRaiz.class, itemExpansivelDataSource);
}
public void insert(Object objeto){
if(dataSourcesMap.containsKey(objeto.getClass())) {
return dataSourcesMap.get(objeto.getClass()).insert(objeto);
} else {
throw new RuntimeException(ErrorMessages.NAO_EXISTE_DATA_SOURCE.toString());
}
}
還有我的數據源的聲明
public interface DataSource<T> {
List<T> getAll();
T findById(Integer id);
void openConection();
void closeConection();
void update(T valor);
void update(List<T> valores);
T insert(T valor);
List<T> insert(List<T> valores);
void delete(T valor);
void delete(List<T> valores);
Integer getLastInsertedRowId();
T converter(Cursor cursor);
}
我的問題是java不知道它將作為參數接收什么樣的對象,因此我無法像嘗試做的那樣調用insert方法,我需要找到解決方法,但是我什么也沒想。給我一些啟發,因為我真的認為這是控制DAO對象API的好方法。
使其成為類型安全的唯一方法是在DataSource
interface
添加一個返回所需類型的方法,即:
Class<T> getDataType();
然后,您可以通過為每個操作引入幫助器方法,將Map
操作轉換為類型安全的代碼:
public Object insert(Object objeto){
final DataSource<?> dataSource = dataSourcesMap.get(objeto.getClass());
if(dataSource!=null) {
assert dataSource.getDataType().isInstance(objeto);
return doInsert(dataSource, objeto);
} else {
throw new RuntimeException(ErrorMessages.NAO_EXISTE_DATA_SOURCE.toString());
}
}
private static <T> T doInsert(DataSource<T> ds, Object o) {
return ds.insert(ds.getDataType().cast(o));
}
沒有這種方法的唯一方法是在沒有類型安全的情況下工作。 如果您的Map
是私有的,並且您正確地維護了映射,以便始終具有有效的Class
-key→值的type參數關系,則可以選擇此選項。 在這種情況下,請使用上述輔助方法,但用不安全的類型轉換(T)o
替換ds.getDataType().cast(o)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.