操作集合的java最佳实践
以下情况: 我创建了一些方法,允许我操作列表。举个简单的例子,这些方法是addSomeElements(…)并删除某些元素(…)
调用这些方法的最佳方法是什么?我知道下面的方法,但不知道哪种是最好的
1)重新初始化列表
private void doSomething(List<String> list) {
list = addSomeElements(list);
list = removeSomeElements(list);
}
在这种情况下,方法当然必须返回一个列表:
private List<String> addSomeElements(List<String> list) {
list.add(...);
return list;
}
2)创建新变量
private void doSomething(List<String> list) {
final List<String> list2 = addSomeElements(list);
final List<String> list3 = removeSomeElements(list2);
}
private List<String> addSomeElements(List<String> list) {
final List<String> newList = new ArrayList<String>(list);
newList.add(...);
return newList;
}
3)使用无效方法进行工作
private void doSomething(List<String> list) {
addSomeElements(list);
removeSomeElements(list);
}
private void addSomeElements(List<String> list) {
list.add(...);
}
这将是最简单的方法,但我不太喜欢,因为我认为对于用户来说,你在做什么并不总是显而易见的。例如,如果你有一个int,你会像int-myInt=0那样声明它。当您想要更改该值时,可以说myInt=1。很明显,myInt现在有了一个新值。但名单不同。要更改的列表可能只是要调用以修改列表的方法的几个参数之一。如果方法的命名没有告诉用户,用户可能不知道您修改了列表,列表似乎只是一个参数
这里“最干净”的方法是什么
# 1 楼答案
我建议创建新列表,而不是操纵现有实例。使用不可变状态(这意味着复制状态而不是修改状态)通常会导致更干净的代码和更少的bug。所以我建议你还是走这条路吧
可变方法(修改现有列表)可能更快,但除非您有很好的理由进行优化,否则不要这样做
# 2 楼答案
如果要修改传递到方法中的列表,请不要返回列表引用(您的选项#1
和选项#2,因为已编辑);它在API级别给人的印象是,您正在创建一个新的列表,而不是修改给您的列表这就给您留下了两个选择,其中一个是“最佳实践”,具体取决于上下文:
修改传入的列表,并使用
void
方法(或完全返回其他内容的方法,如果合适)。(这是你的选择#3。)使用添加/删除创建新列表,并返回对新列表的引用。(这是类似于您编辑的选项#2,但请注意,您还必须在
doSomething
中返回list3
,才能使其有意义。)