更新方法中列表的参数:是否返回列表

Pau*_*Pau 5 java coding-style

我有一个像下一个类的对象列表:

class A {
    private String property1;
    private String property2;
    //Setters && Getters

}
Run Code Online (Sandbox Code Playgroud)

因此,在一些操作之后,我需要使用默认值更新列表,其中包含一些逻辑,如下所示:

 listOfA.forEach(item -> { 
       item.setProperty1(findSomething());
 } 
Run Code Online (Sandbox Code Playgroud)

这个逻辑重复了几次,所以我想把它导出到一个方法中。所以,我的问题与此方法有关:我应该使用 void 方法更新列表的副本引用,返回它还是创建新列表并更新它?:

选项 1:更新列表的副本引用

 private void updateList(List<A> listOfA) {
     listOfA.forEach(item -> { 
       item.setProperty1(findSomething());
    }
 }
Run Code Online (Sandbox Code Playgroud)

选项2:退货

private List<A> updateList(List<A> listOfA) {
     listOfA.forEach(item -> { 
       item.setProperty1(findSomething());
    }

    return listOfA;
 }
Run Code Online (Sandbox Code Playgroud)

选项 3:从另一个创建一个新列表,更新它并返回它

private List<A> updateList(List<A> listOfA) {
     List<A> newList = new ArrayList<>();
     //Logic to copy listOfA in newList....

     newList.forEach(item -> { 
       item.setProperty1(findSomething());
    }

    return newList ;
 }
Run Code Online (Sandbox Code Playgroud)

hot*_*zst 3

最后,您更喜欢哪个选项完全是个人意见。不过,有一些注意事项可能会帮助您做出决策:

第一个和第二个选项实际上是相同的。两者都对List作为参数传入的 进行操作。列表的更新不会创建任何新内容。这建议选择选项 1 作为选择的解决方案,因为只有签名(没有附加文档)选项 2 可能表明返回的列表是一个新List实例。

返回List选项 2 和 3 中的 as 的优点是您可以对该列表执行进一步的操作,从而使其可以更改。

最后一个选项采用防御性副本来实际创建输入的新实例List并对该列表进行操作。虽然这样做是一种很好的做法,但它可能会产生一些副作用,这可能是不需要的。使用选项 2 时,不需要将返回的列表分配给任何内容,因为它与作为参数传入的实例相同。这不是选项 3 的情况。这里必须对结果进行赋值,否则它就符合垃圾回收的条件。