簡體   English   中英

在 java 中返回通配符列表時的最佳實踐

[英]Best practice when returning a wildcard List in 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;
}

不要返回通配符類型:使用受約束的類型變量:

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

這樣做的好處是您可以繼續將結果用作List<SubclassOfDbModel> :如果您返回List<? extends DbModel> List<? extends DbModel> ,你不能做添加或設置項目之類的事情。


我鼓勵您閱讀Effective Java 2nd Ed Item 28,“使用有界通配符來增加 API 靈活性”,其中建議在參數中使用有界通配符,但不要在返回值中使用。

為了使參數更靈活,您可以使用:

List<? extends T> statLineList

作為參數; 這只是讓您執行以下操作:

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

您無法使用頂部的代碼執行此操作,因為List<PitchingStatsDb>不是List<DbModel>的子類。 這有點復雜,為了更多的靈活性; 我讓你來判斷這段代碼是否值得。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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