作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 DynamoDB。我想创建一个数据库适配器类(而不是在程序的各个部分中查看一堆复制/粘贴的代码),它可以执行以下操作:
DynamoDBMapper mapper = Dynamo.getMapper(SomeClassHere.TABLE_NAME);
DynamoDBQueryExpression<SomeClassHere> queryExpression = new DynamoDBQueryExpression<SomeClassHere>()
.withHashKeyValues(passedInObjectHere);
List<SomeClassHere> list = mapper.query(SomeClassHere, queryExpression);
因此 SomeClassHere 将是类的名称作为其类型,也用于映射 DynamoDBMapper 中的字段。
我想传递一个与此类似的对象参数:
public void getList(IDynamoDBModel model) {
DynamoDBMapper mapper = Dynamo.getMapper(GetTheClassTypeFromTheModel);
DynamoDBQueryExpression<GetTheClassTypeFromTheModel> queryExpression = new DynamoDBQueryExpression<GetTheClassTypeFromTheModel>()
.withHashKeyValues(model);
List<GetTheClassTypeFromTheModel> list = mapper.query(GetTheClassTypeFromTheModel, queryExpression);
}
这样,我就可以简单地:
,而不是到处复制/粘贴“保存代码”、“删除代码”、“获取项目代码”我意识到泛型是在编译时使用的,这可能是徒劳的,但我真的想清理这个继承的代码库。
最佳答案
我不熟悉 DynomoDB。
但根据我的理解,您希望从 DynamoDB 实现通用数据访问层。它可以通过通用来实现,我已经实现了下面的代码,您可以了解如何实现这一点。
请忽略 DynamoDB 规范,仅通过复制和粘贴此代码将无法工作。因此请确保进行相应的编辑。
实现DynamoTypeProvider接口(interface)。
@FunctionalInterface
public interface DynamoTypeProvider<DynamoType> {
Class<DynamoType> getDynamoType();
}
为 DynamoDB 实现通用数据访问服务,如下所示。
public abstract class DynamoQueryService<DynamoType, DynamoDBModel extends DynamoTypeProvider<DynamoType>> {
public List<DynamoType> getList(DynamoDBModel model) {
DynamoDBMapper mapper = Dynamo.getMapper(model.getDynamoType());
DynamoDBQueryExpression<DynamoType> queryExpression = new DynamoDBQueryExpression<DynamoType>()
.withHashKeyValues(model);
return mapper.query(model.getDynamoType(), queryExpression);
}
}
假设 Dynamo 类型为 UserType,DynamoDBModel 为 User。从 User 中我们应该能够获取 Dynamo DB 类型 UserType。
public class UserType {
//your code.
}
public class User implements DynamoTypeProvider<UserType>{
//your code
@Override
public Class<UserType> getDynamoType() {
return UserType.class;
}
然后实现指定模型类型的数据访问服务。这里是 UserDynamoQueryService。
public class UserDynamoQueryService extends DynamoQueryService<UserType, User> {
}
然后你可以得到UserType为
UserDynamoQueryService service = new UserDynamoQueryService();
List<UserType> types = service.getList(new User());
使用 Generic 你可以实现这一点。请确保相应地编辑此内容。
或者您可以尝试下面的示例。
public class DynamoQueryService {
public <T, X> List<T> getList(X x, Class<T> tClass) {
DynamoDBMapper mapper = Dynamo.getMapper(tClass);
DynamoDBQueryExpression<T> queryExpression = new DynamoDBQueryExpression<T>()
.withHashKeyValues(x);
return mapper.query(tClass, queryExpression);
}
}
并按如下方式使用。
DynamoQueryService queryService = new DynamoQueryService();
List<UserType> userTypes = service.getList(new User(), UserType.class);
那么用户不需要实现DynamoTypeProvider。
关于java - 如何将类型作为变量传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57545872/
我是一名优秀的程序员,十分优秀!