在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)。
答案 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
。