返回列表或通过引用修改

时间:2013-11-20 15:23:37

标签: java

在java中,我有一个修改列表内容的方法。使用起来更好:

public List modifyList(List originalList) { // note - my real method uses generics
     // iterate over originalList and modify elements
     return originalList;
}

或者更好的做法如下:

public void modifyList(List originalList) {
      // iterate over originalList and modify elements
      // since java objects are handled by reference, the originalList will be modified
      // even though the originalList is not explicitly returned by the method
}

注意 - 两种方法之间的唯一区别是返回类型(一个函数返回void而另一个返回List)。

5 个答案:

答案 0 :(得分:1)

如果你只是操纵清单,那完全取决于气质。有些人(包括我)认为使用第一个选项更容易阅读代码(并且如果你想要那样的话,它允许按照亚当的指示进行链接)。

但是,请记住,它并不是真正传入的引用。它实际上是一个指针。因此,如果由于某种原因重新初始化originalList实例,就像放入

一样
originalList = new ArrayList();

在你的方法体中。这不会影响您实际传入方法的列表。

答案 1 :(得分:1)

在我看来,你应该只鼓励使用不可变类的方法链接。

如果你的函数改变了一个对象,那么如果在一系列方法中,就很容易意外地做到这一点。

答案 2 :(得分:1)

这完全取决于你如何使用List - 如果你正在实现某种列表,这是你的List类的非静态方法,那么你应该写

public List modifyList() // returning list

public int modifyList() // number of elements changed

如果这是本课程之外的方法

关于在列表或其副本上执行操作:您应该考虑所需的行为和您的期望 - 最重要的是 - 我是否需要“旧”列表副本?。深度复制列表可能有点开销。浅拷贝将无法对列表的某些元素执行操作(即更改它的属性 - 如果它们是对象)而不影响“旧”列表。

关于返回void:最好返回更改后的列表(或至少更改的元素数量),这样可以链接方法调用,如果不需要,您可以随时忽略它。

答案 3 :(得分:1)

选项1的一个可能的好处是它可以接受null列表。例如,如果您正在收集Foos,并且通常会创建一个全新的List,但希望选项添加到现有列表中。例如(注意方法名称)

public List<Foo> appendFoos(List<Foo> in) {
  if (in == null)
    in = new ArrayList<Foo>;

  // now go do it, e.g.
  in.add(someFooIFound);

  return in;
}

并且,如果您愿意,还可以添加一个明确的no-arg“get”方法

public List<Foo> getFoos() {
   return appendFoos(null);
}

现在,在选项#2中,您可以通过让用户创建一个新的空ArrayList并将其传入来完成此操作,但选项#1更方便。即。

选项1用法:

List<Foo> theFoos = getFoos();

选项2用法:

List<Foo> theFoos = new ArrayList<Foo>();
appendFoos(theFoos);

答案 4 :(得分:0)

由于List是可变的,所以第二种方法更好。您无需返回修改后的List