操作集合的最佳实践

时间:2016-02-16 12:48:11

标签: java collections

以下情况: 我创建了一些方法,允许我操作List。举一个简单的例子,这些方法是addSomeElements(...)和removeSomeElements(...)

调用这些方法的最佳方法是什么?我知道如何做到这一点,但不知道哪一个最好?!

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)使用void方法

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现在有了一个新的值。但是列表与众不同。您要更改的列表可能只是您要调用以修改列表的方法的几个参数之一。如果方法的命名没有告诉它,用户可能无法识别您已经修改了列表,该列表似乎只是一个参数。

这里最“干净”的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您正在修改传递给方法的列表,请不要返回列表引用(您的选项#1 和选项#2 自编辑后);它会在API级别给出您正在创建列表的印象,而不是修改您给出的那个。

这给你留下了两个选择,其中任何一个都是“最佳实践”,具体取决于具体情况:

  1. 修改传入的列表,并使用void方法(或者在适当的情况下完全返回其他内容的方法)。 (这是你的选择#3。)

  2. 使用添加/删除创建新列表,并返回对新列表的引用。 (这是喜欢您编辑的选项#2,但请注意,您还必须从list3返回doSomething才能使其有意义。)

    < / LI>

答案 1 :(得分:1)

我建议创建新列表,而不是操纵现有实例。使用不可变状态(这意味着复制状态而不是修改状态)通常会导致更清晰的代码和更少的错误。所以我建议继续前进。

可变方法(修改现有列表)可能会更快,但除非您有充分的理由进行优化,否则不要这样做。