【发布时间】:2019-05-18 01:29:49
【问题描述】:
我正在尝试重构 DAO,使其在我们的代码库中更有用。我们目前有一个参数化的 AbstractDao,它接受三种类型:
- 数据库表
- 数据库pojo
- 2) 的不同映射 pojo 表示
所以它最终看起来像:
public class AbstractDao<T extends DatabaseTable, R extends DatabaseRecord, M> {
public AbstractDao(Connection connection, Mapper<R,M> mapper) {
//save connection and mapper to protected variables
}
public List<M> insert(List<M> records) {
connection.insertBulk(
StreamEx.of(records).map(mapper::map).toList()
);
}
}
但是,这不适用于我们只处理 pojo 和 table 的经典 DAO 案例。
但是,这里有一个通用功能可以抽象为更基本的 AbstractDao,它在项目中很有用。比如:
AbstractDao<T extends DatabaseTable, R extends Record>
有一个子类
AbstractMappedDao<T extends DatabaseTable, R extends Record, M> extends AbstractDao<T, R>
摘要有一个类似的方法:
public List<R> insert(List<R> records) {
connection.insertBulk(records);
}
并且 Mapped 应该有一个类似的方法:
public List<M> insert(List<M> records) {
super.insert(StreamEx.of(records).map(mapper::map).toList());
}
但是,这会产生“相同的擦除”问题,因为 insert 接受泛型列表。
我已经尝试将它抽象成一个接口:
public interface Dao<T> {
public List<T> insert(List<T> records);
}
让 Abstract 实现 Dao 和 Mapped 实现 Dao,但同样的问题。
所以我的问题是如何最好地解决这个问题?如果我将地图的签名更改为以下内容,这将按预期工作:
insertMapped(List<M> mapped);
但我更愿意保持合同不变。
感谢您的帮助。期待讨论!
【问题讨论】:
标签: java algorithm generics design-patterns collections