【发布时间】:2023-03-20 12:45:02
【问题描述】:
所以,我遇到过这种情况
我有一个 Restful 控制器方法,它返回 list 对象 Match
@RequestMapping(value = "/fetchFootballMatchesToday", method = RequestMethod.GET)
public @ResponseBody List<Match> fetchMatchesScheduledToday() throws ParseException {
return matchesToday;
}
Match 对象有 15 个属性,我只需要 UI 上的 3 个属性。我不希望用户看到对象的其他属性。
有两种方法:
-
运行一个 for 循环并为每个
Match对象显式设置属性为 null,这些对象并不打算发送到 UI。像这样List<Match> matchesToday = matchInvService.fetchMatchByDate(today); for (Match stats : matchesToday) { if (stats != null) { /* user should not know these details, so they are being set to null */ stats.setMatchSuccessIndex(null); stats.setTeamRanking(null); stats.setStadiumInfrastructureLevel(null); ..... & so on } }
这种方法的问题在于未来属性的数量会增加。此代码也需要更新。此外,如果对象的属性数量很大。我需要在这里多次设置 null。
-
第二种方法是在循环中创建一个新的 Match 对象并为其设置 3 个必需的值。
List<Match> matchesToday = matchInvService.fetchMatchByDate(today); List<Match> responseList = new ArrayList<Match>(); for (Match stats : matchesToday) { if (stats != null) { Match tmpMatch = new Match(); match.setProperty1(stats.getProperty1()); } responseList.add(tmpMatch); } return responseList;
每次循环运行时,这种方法都会创建额外的 Match 对象。此外,如果过于频繁地调用该特定方法,对象的创建也会激增。 尽管这些对象将被垃圾收集,但我不确定这是否是最佳方式。
需要你们的建议。这是编写更多代码与节省内存之间的权衡吗?解决这个问题的最佳方法是什么?
【问题讨论】:
-
Jersey 使用标准做法,即每个控制器方法都返回一个 Response 对象。这是一个包装器对象,其中包含实际的响应实体。您可以通过使用自定义地图来使用类似的方法。或具有键、值属性的自定义对象。然后,您可以只设置您关心的所需属性并作为响应发送。
-
我假设
Match也是一个数据库实体? -
@22kar 但又一次,我需要创建那么多对象,然后将它们添加到列表中。你说的第二种方法对吗?
-
@Aris 是的
-
查看下面的答案
标签: java spring performance