日期:2014-05-20  浏览次数:20618 次

在方法中返回集合类型时,是直接返回一个arr好,还是返回一个new ArrayList(arr)好?
有这样两段代码:

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));
}