簡體   English   中英

如何將類型作為變量傳遞?

[英]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);

}

這樣,無需在任何地方復制/粘貼“保存代碼”,“刪除代碼”,“獲取項目代碼”,我可以簡單地:

  • 呼叫連接管理員
  • 從中獲得與DynamoDb的連接
  • 將具有其預加載值的對象傳遞到適當的方法(保存,刪除,getItem等...)

我意識到泛型是在編譯時使用的,這可能是徒勞的,但是我非常想清理這個繼承的代碼庫。

我對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM