我正在尝试创建一个类,负责管理我的应用程序的所有数据库访问,控制具有所有受保护方法的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的好方法..非常感谢
答案 0 :(得分:1)
使其成为类型安全的唯一方法是向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
- 键→值的类型参数关系,这可能是一个选项。在这种情况下,请使用上面的帮助方法,但用不安全的类型转换替换ds.getDataType().cast(o)
:(T)o
。