这与hibernate和thrift本身无关。
我正在开发一个Java应用程序,我通过Hibernate从数据库中获取数据,并希望通过apache thrift服务来提供这些对象。到目前为止,我只有很少的模型,但是对于每个模型,我必须遍历hibernate对象列表并构造thrift对象列表。
例如,考虑下面的代码片段(这是thrift服务处理程序,它将hibernate集合作为IN并返回thrift集合):
@Override
public List<TOutcome> getUserOutcomes(int user_id) throws TException {
List<Outcome> outcomes = this.dataProvider.getOutcomesByUserId(user_id);
List<TOutcome> result = new ArrayList<>();
for (Iterator iterator = outcomes.iterator(); iterator.hasNext();) {
Outcome outcome = (Outcome) iterator.next();
TOutcome t_outcome = new TOutcome(
(double) (Math.round(outcome.getAmount() * 100)) / 100,
outcome.getUser().getName(),
String.valueOf(outcome.getCategory().getName()));
t_outcome.setComment(outcome.getComment());
result.add(t_outcome);
}
return result;
}
@Override
public List<TIncome> getUserIncomes(int user_id) throws TException {
List<Income> incomes = this.dataProvider.getIncomesByUserId(user_id);
List<TIncome> result = new ArrayList<>();
for (Iterator iterator = incomes.iterator(); iterator.hasNext();) {
Income income = (Income) iterator.next();
TIncome t_income = new TIncome(
(double) (Math.round(income.getAmount() * 100)) / 100,
income.getUser().getName(),
String.valueOf(income.getCategory().getName()));
t_income.setComment(income.getComment());
result.add(t_income);
}
return result;
}
Outcome
,Income
- 这些是Hibernate带注释的类,TOutcome
,TIncome
- 是相关的thrift对象(共享80-90%的字段)。
现在违反了“DRY”原则,因为此代码非常非常相似。我想提供一个通用的方法来迭代hibernate对象并返回thrift对象。我在考虑仿制药和设计模式。
在动态语言中,我可以使用字符串来构建类名和构造对象(没有类型检查)。我想有可能在Java中做类似的东西,使用泛型,但我不知道我应该从哪里开始。
答案 0 :(得分:1)
正如我所看到的,只有大约10行代码是常见的,并且它们很常见,而不是业务需求。当然,您可以重构代码以提取一些接口:一个用于数据提供者在getOutcomesByUserId
和getIncomesByUserId
之间进行选择,另一个用于对象工厂 - new TIncome
或new TOutcome
。或者使用反射。但是,这些代码变体看起来会更复杂,更难以支持。我认为目前它足够好,不值得改变。期望更好地使用for(Income income : incomes)
而不是迭代器样板。
但是,如果您有一个复杂但相似的数据结构要映射,有些库可以显着简化映射。看看Dozer。