2014-02-27 70 views
0

我正在嘗試創建一個負責管理我的應用程序的所有數據庫訪問的類,控制具有所有受保護方法的DAO對象的API。有些indentifiers在葡萄牙語,因爲我是巴西人,反正我覺得你就能理解什麼在那裏發生的..以下是代碼:如何在運行時獲取對象類型?

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不知道它會作爲參數接受什麼樣的對象,所以我不能調用插入方法,因爲我試圖做,我需要找到一個工作,但我不能想到什麼都沒有..我希望有人能給我帶來一些光明,因爲我真的認爲這是控制我的DAO對象的API的好方法。非常感謝

回答

1

使它類型安全的唯一方法是將方法添加到您的DataSourceinterface返回所需的類型,即:

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→值的類型參數關係,則這可能是一個選項。在這種情況下,請使用上述幫助程序方法,但用不安全的類型替換ds.getDataType().cast(o)(T)o

相關問題