在休眠和节俭之间进行翻译

时间:2013-03-28 11:49:33

标签: java generics

这与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;
}

OutcomeIncome - 这些是Hibernate带注释的类,TOutcomeTIncome - 是相关的thrift对象(共享80-90%的字段)。

现在违反了“DRY”原则,因为此代码非常非常相似。我想提供一个通用的方法来迭代hibernate对象并返回thrift对象。我在考虑仿制药和设计模式。

在动态语言中,我可以使用字符串来构建类名和构造对象(没有类型检查)。我想有可能在Java中做类似的东西,使用泛型,但我不知道我应该从哪里开始。

1 个答案:

答案 0 :(得分:1)

正如我所看到的,只有大约10行代码是常见的,并且它们很常见,而不是业务需求。当然,您可以重构代码以提取一些接口:一个用于数据提供者在getOutcomesByUserIdgetIncomesByUserId之间进行选择,另一个用于对象工厂 - new TIncomenew TOutcome。或者使用反射。但是,这些代码变体看起来会更复杂,更难以支持。我认为目前它足够好,不值得改变。期望更好地使用for(Income income : incomes)而不是迭代器样板。

但是,如果您有一个复杂但相似的数据结构要映射,有些库可以显着简化映射。看看Dozer