有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

操作集合的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现在有了一个新值。但名单不同。要更改的列表可能只是要调用以修改列表的方法的几个参数之一。如果方法的命名没有告诉用户,用户可能不知道您修改了列表,列表似乎只是一个参数

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


共 (2) 个答案

  1. # 1 楼答案

    我建议创建新列表,而不是操纵现有实例。使用不可变状态(这意味着复制状态而不是修改状态)通常会导致更干净的代码和更少的bug。所以我建议你还是走这条路吧

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

  2. # 2 楼答案

    如果要修改传递到方法中的列表,请不要返回列表引用(您的选项#1和选项#2,因为已编辑);它在API级别给人的印象是,您正在创建一个新的列表,而不是修改给您的列表

    这就给您留下了两个选择,其中一个是“最佳实践”,具体取决于上下文:

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

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