[英]How do I pass the type as a variable?
我正在使用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接口。
@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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.