Java中如何将数据类作为参数传入方法以移除硬编码依赖
问题描述
- 场景:myApp包内有POJO编写的数据类,已将UtilLibrary包作为Jar导入myApp
- 需求:移除UtilLibrary中Sample类
putBatchRecords方法对TestTable类的硬编码,改为通过传入数据类实现,同时删除对应的import语句 - 问题:修改后出现编译错误
原硬编码代码:
import com.package.dataclasses.TestTable; public class Sample { public String putBatchRecords(DynamoDbEnhancedClient enhancedClient, Object tableObj) { try { DynamoDbTable<TestTable> objTableMappedClass = enhancedClient.table("Test_Table", TableSchema.fromBean(TestTable.class)); BatchWriteItemEnhancedRequest batchWriteItemEnhancedRequest = BatchWriteItemEnhancedRequest.builder() .writeBatches( WriteBatch.builder(TestTable.class) .mappedTableResource(objTableMappedClass) .addPutItem(builder -> builder.item((TestTable) tableObj)) .build() ) .build(); enhancedClient.batchWriteItem(batchWriteItemEnhancedRequest); } } catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1); } return "Batch write successful"; } }
解决方案
通过泛型实现方法的通用化,彻底解除对具体数据类的硬编码依赖,修改后的代码如下:
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient; import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable; import software.amazon.awssdk.enhanced.dynamodb.TableSchema; import software.amazon.awssdk.enhanced.dynamodb.model.BatchWriteItemEnhancedRequest; import software.amazon.awssdk.enhanced.dynamodb.model.WriteBatch; import software.amazon.awssdk.services.dynamodb.model.DynamoDbException; public class Sample { // 新增泛型参数T,适配任意符合DynamoDB要求的POJO数据类 public <T> String putBatchRecords(DynamoDbEnhancedClient enhancedClient, Class<T> dataClass, T tableObj, String tableName) { try { // 用泛型参数替代硬编码的TestTable DynamoDbTable<T> objTableMappedClass = enhancedClient.table(tableName, TableSchema.fromBean(dataClass)); BatchWriteItemEnhancedRequest batchWriteItemEnhancedRequest = BatchWriteItemEnhancedRequest.builder() .writeBatches( WriteBatch.builder(dataClass) .mappedTableResource(objTableMappedClass) .addPutItem(builder -> builder.item(tableObj)) .build() ) .build(); enhancedClient.batchWriteItem(batchWriteItemEnhancedRequest); } catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1); } return "Batch write successful"; } }
关键修改点说明
- 新增泛型
<T>:让方法支持任意类型的POJO数据类,无需硬编码具体类 - 新增
Class<T> dataClass参数:动态获取数据类的类型信息,替代原来的TestTable.class - 新增
String tableName参数:将硬编码的表名改为可配置,进一步提升通用性 - 移除强制类型转换
(TestTable) tableObj:通过泛型保证类型安全,避免类型转换异常 - 删除对
TestTable的import语句:彻底解除对该类的依赖
myApp中的调用示例
假设你的数据类是TestTable,调用时传入对应参数即可:
// 初始化DynamoDbEnhancedClient DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create(); // 实例化数据类对象并设置属性 TestTable testTableObj = new TestTable(); // ...设置testTableObj的属性 // 调用通用方法 Sample sample = new Sample(); sample.putBatchRecords(enhancedClient, TestTable.class, testTableObj, "Test_Table");
内容的提问来源于stack exchange,提问作者Praha Murali
相关产品推荐
相关产品推荐

