有这样两段代码:
- Java code
第一类private Map<Integer, ArrayList<Question>> questions = new HashMap<Integer,ArrayList<Question>>();public ArrayList<Question> getQuestions(int level) { return new ArrayList<Question>(questions.get(level));}第二类private Map<Integer, ArrayList<Question>> questions = new HashMap<Integer,ArrayList<Question>>();public ArrayList<Question> getQuestions(int level) { return questions.get(level);}
请问是像第一类那样,返回时,通过原来的集合,new一个新的ArrayList好呢?
还是像第二类那样,直接返回原来的集合好呢?
貌似比较多的情况是用第一种,请问这么做相比第二种,好处是什么呢?
------解决方案--------------------
第一种肯定是占用内存,重新开辟一块内存,如何你对内存问题不在乎,要么可以使用吧
第二种直接返回,方便。前途是定义好了类型
鄙人愚见,欢迎来喷。。
------解决方案--------------------
无定论,关系到你模块的封装粒度要求,计算依赖要求,性能要求,内存开销要求。
最终权衡而定。
一般来说,如果对封装要求不是非常高(必须使用标准的某种VO结构之类的),其被暴露出去的对象结构并不存在后续的计算依赖(也就是说传递出去后即便被随意修改,也不会对这个类后续的计算造成任何影响),那么用第二种更合适。反之则第一种。
另一种判断方式可以稍微宏观点:该接口如果是在一个大模块内部使用的,用第二种;如果该接口是为其它模块提供服务的,用第一种。
------解决方案--------------------
我个人喜欢第二种,能直接返回一个ArrayList,非要在外面包装一个 没有意义啊。
------解决方案--------------------
这有点像 IO这快的Buffered使用与否
new Bufferedxxx(new xxxx())
------解决方案--------------------
包装的话是重新生成了一个list,跟原来的的map中存放的已经没有关系了
三楼说的很明显了
跟你的代码的业务有关联,
如果后续代码对这个list只有读操作,那么第二种方案好
如果后续代码对这个list进行了增删改操作,那么就要根据业务逻辑来决定了
------解决方案--------------------
如果方法是private,就直接返回,因为你对代码有完全的控制权
如果方法是public,就封一层再返回,因为你不知道别人会如何使用你的返回值
------解决方案--------------------
1.是否允许其它模块修改你的数据
2.是否通过这个返回值保持其它模块与你的数据同步
如果1,2都不满足,那么返回一个新的List.......对应第一类
如果1,2都满足,那么直接返回List............对应第二类
如果需要数据同步,又不希望其它模块修改........对应第三类
- Java code
private Map<Integer, ArrayList<Question>> questions = new HashMap<Integer,ArrayList<Question>>();public List<Question> getQuestions(int level) { return Collections.unmodifiableList(questions.get(level));}