[英]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.