在java中返回通配符List时的最佳实践

时间:2016-08-08 20:49:14

标签: java

我有两个函数都返回类似数据库bean的列表(它们都实现了相同的接口,DbModel)。我需要以完全相同的方式过滤这些列表。我对通配符比较新,并且想知道这是否是正确的方法。任何帮助/替代方法都将非常感激。

public PlayerStats<HittingStatsDb> getHittingSummaryStats(Integer playerId) {
        HittingStatsDbExample example = new HittingStatsDbExample();
        example.createCriteria().andPlayerIdEqualTo(playerId).andSplitKeyEqualTo(Constants.SplitKeys.REGULAR_SEASON);
        example.setOrderByClause("YEAR DESC");
        List<HittingStatsDb> dbList = (List<HittingStatsDb>) summaryFilter(hittingStatsDao.select(example));
        List<PlayerStatLine<HittingStatsDb>> statLineList = ListHelper.map(dbList, (statDb) -> new PlayerStatLine<HittingStatsDb>(statDb));

        return new PlayerStats<HittingStatsDb>(statLineList);
}

public PlayerStats<PitchingStatsDb> getPitchingSummaryStats(Integer playerId) {
    PitchingStatsDbExample example = new PitchingStatsDbExample();
    example.createCriteria().andPlayerIdEqualTo(playerId).andSplitKeyEqualTo(Constants.SplitKeys.REGULAR_SEASON);
    example.setOrderByClause("YEAR DESC");
    List<PitchingStatsDb> dbList = (List<PitchingStatsDb>) summaryFilter(pitchingStatsDao.select(example));
    List<PlayerStatLine<PitchingStatsDb>> statLineList = ListHelper.map(dbList, (statDb) -> new PlayerStatLine<PitchingStatsDb>(statDb));

    return new PlayerStats<PitchingStatsDb>(statLineList);
}

private List<? extends DbModel> summaryFilter(List<? extends DbModel> statLineList) {
    // Filter Logic
    return statLineList;
}

1 个答案:

答案 0 :(得分:1)

不返回通配符类型:使用约束类型变量:

private <T extends DbModel> List<T> summaryFilter(List<T> statLineList) {
  return statLineList;
}

这样做的好处是,您可以继续将结果用作List<SubclassOfDbModel>:如果您返回List<? extends DbModel>,则无法执行添加或设置项目等操作。

我建议您阅读 Effective Java 2nd Ed 第28项“使用有界通配符来提高API灵活性”,建议在参数中使用有界通配符,但不能返回值。

要使参数更灵活,您可以使用:

List<? extends T> statLineList

作为参数;这只是让你做的事情:

List<PitchingStatsDb> unfiltered = ...
List<DbModel> filtered = summaryFilter(unfiltered);

您无法使用顶部的代码,因为List<PitchingStatsDb>不是List<DbModel>的子类。它更复杂一点,更灵活一点;我告诉你,判断这段代码是否值得。