有这样两段代码:
第一类
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好呢?
还是像第二类那样,直接返回原来的集合好呢?貌似比较多的情况是用第一种,请问这么做相比第二种,好处是什么呢?

解决方案 »

  1.   

    我个人喜欢第二种,能直接返回一个ArrayList,非要在外面包装一个  没有意义啊。
      

  2.   

    这有点像  IO这快的Buffered使用与否new Bufferedxxx(new xxxx())
      

  3.   

    到底哪种方式更好呢?恳请火龙果,ZangXT大侠等前辈指教
      

  4.   

    包装的话是重新生成了一个list,跟原来的的map中存放的已经没有关系了
    三楼说的很明显了
    跟你的代码的业务有关联,
    如果后续代码对这个list只有读操作,那么第二种方案好
    如果后续代码对这个list进行了增删改操作,那么就要根据业务逻辑来决定了
      

  5.   


    如果方法是private,就直接返回,因为你对代码有完全的控制权如果方法是public,就封一层再返回,因为你不知道别人会如何使用你的返回值
      

  6.   

    1.是否允许其它模块修改你的数据
    2.是否通过这个返回值保持其它模块与你的数据同步如果1,2都不满足,那么返回一个新的List.......对应第一类
    如果1,2都满足,那么直接返回List............对应第二类
    如果需要数据同步,又不希望其它模块修改........对应第三类
    private Map<Integer, ArrayList<Question>> questions = new HashMap<Integer,ArrayList<Question>>();
    public List<Question> getQuestions(int level) {
    return Collections.unmodifiableList(questions.get(level));
    }
    说到底,还是要看具体的设计需求。
    如果考虑到多线程的话,就更复杂了
      

  7.   

    《Effective java》里,推荐第一种