如何将类型作为变量传递?

时间:2019-08-18 15:16:21

标签: java amazon-dynamodb

我正在使用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);

}

通过这种方式,我可以简单地:

而不是在各处复制/粘贴“保存代码”,“删除代码”,“获取项目代码”。

  • 呼叫连接管理器
  • 从中获得与DynamoDb的连接
  • 将对象及其预加载的值传递到适当的位置 方法(保存,删除,getItem等)

我意识到泛型是在编译时使用的,这可能是徒劳的,但我迫切希望清理此继承的代码库。

1 个答案:

答案 0 :(得分:0)

我不熟悉DynomoDB。

但是根据我的理解,您想从DynamoDB实现通用数据访问层。它可以通过泛型实现,我在下面的代码中实现了您的知识,以了解如何实现这一目标。

请忽略DynamoDB规范,仅复制和粘贴此代码将不起作用。因此请确保进行相应的编辑。

实现DynamoTypeProvider接口。

@FunctionalInterface
public interface DynamoTypeProvider<DynamoType> {
    Class<DynamoType> getDynamoType();
}

为DyanamoDB实施通用数据访问服务,如下所示。

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());

使用泛型可以实现此目的。 请确保对此进行相应的编辑。

或者您可以尝试以下示例。

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。