更新方法中列表的参数:return list or not
Update parameters of a list in a method: return list or not
我有一个类似下一个的对象列表 class:
class A {
private String property1;
private String property2;
//Setters && Getters
}
所以,在一些操作之后,我需要使用默认值和一些逻辑更新列表,如下所示:
listOfA.forEach(item -> {
item.setProperty1(findSomething());
}
这个逻辑重复了几次,所以我想将它导出到一个方法中。因此,我的问题与此方法有关:我应该使用 void 方法 return 更新列表的复制引用,还是创建新列表并更新它?:
选项1:更新列表的复制引用
private void updateList(List<A> listOfA) {
listOfA.forEach(item -> {
item.setProperty1(findSomething());
}
}
选项2:Return它
private List<A> updateList(List<A> listOfA) {
listOfA.forEach(item -> {
item.setProperty1(findSomething());
}
return listOfA;
}
选项 3:从另一个列表创建一个新列表,更新此列表并 return 它
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 ;
}
方法 :3
当你创建一个新的列表对象时,它需要一定的堆内存。然后你只需从你的 agrument 列表中复制内容并更新它和 return 新列表。在这里创建一个新的列表对象会让人头疼。没必要。
方法:2
在此方法中,不会为您创建新列表 return 相同的列表。而 java 按值调用(这里的值表示 ref 对象的值)。您可以在不需要 return 的调用方法上获取更新列表。当您返回一个对象时,您会增加该方法的元数据。
方法:1
这是最好的方法。在这里,您正在使用按值调用的好处(这里的值表示 ref 对象的值)。没有占用不必要的额外内存。
没有不必要的return。这是正确的方法。
一切看情况。
选项 1
当您不需要在其他任何地方使用您的列表时,这种情况是合适的。我的意思是,如果其他对象将此列表引用作为成员,则此对象也会修改此成员。
选项 2
这种情况看起来像情况 1,您可以将此方法用作情况 1,但在这里您 return 您的列表。它在第一种情况下带来了一些优势,您可以在 Stream API 或 Optionals:
链中使用您的方法
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 ;
}
public List<A> myMethod() {
List<A> myList = null;
// possible initialization of list
// ...
// here we update list. In the case when list is null then we do not modify it
return Optional.ofNullable(myList).map(this::updateList).orElse(null);
}
选项 3
在这种情况下,您将数组复制到另一个数组中。在不应修改初始数组的情况下,它是有意义的,例如它是其他一些 class.
的字段
最后你更喜欢哪个选项完全是个人意见。但是,有一些注意事项可能会帮助您做出决定:
第一个和第二个选项几乎是一样的。两者都对作为参数传入的 List
进行操作。列表的更新不会创建任何新内容。这将建议选项 1 作为选择的解决方案,因为只有签名(没有额外的文档)选项 2 可能表明返回的列表是一个新的 List
实例。
返回选项 2 和选项 3 中的 List
的好处是您可以对该列表执行进一步的操作,从而使其可变。
最后一个选项使用防御性副本来实际创建输入的新实例 List
并对该列表进行操作。虽然这样做是一种很好的做法,但它可能会产生一些副作用,这可能是不需要的。对于选项 2,不需要将返回的列表分配给任何东西,因为它是作为参数传入的同一实例。这不是选项3的情况。这里必须对结果进行赋值,否则就符合垃圾回收的条件。
我有一个类似下一个的对象列表 class:
class A {
private String property1;
private String property2;
//Setters && Getters
}
所以,在一些操作之后,我需要使用默认值和一些逻辑更新列表,如下所示:
listOfA.forEach(item -> {
item.setProperty1(findSomething());
}
这个逻辑重复了几次,所以我想将它导出到一个方法中。因此,我的问题与此方法有关:我应该使用 void 方法 return 更新列表的复制引用,还是创建新列表并更新它?:
选项1:更新列表的复制引用
private void updateList(List<A> listOfA) {
listOfA.forEach(item -> {
item.setProperty1(findSomething());
}
}
选项2:Return它
private List<A> updateList(List<A> listOfA) {
listOfA.forEach(item -> {
item.setProperty1(findSomething());
}
return listOfA;
}
选项 3:从另一个列表创建一个新列表,更新此列表并 return 它
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 ;
}
方法 :3
当你创建一个新的列表对象时,它需要一定的堆内存。然后你只需从你的 agrument 列表中复制内容并更新它和 return 新列表。在这里创建一个新的列表对象会让人头疼。没必要。
方法:2
在此方法中,不会为您创建新列表 return 相同的列表。而 java 按值调用(这里的值表示 ref 对象的值)。您可以在不需要 return 的调用方法上获取更新列表。当您返回一个对象时,您会增加该方法的元数据。
方法:1
这是最好的方法。在这里,您正在使用按值调用的好处(这里的值表示 ref 对象的值)。没有占用不必要的额外内存。 没有不必要的return。这是正确的方法。
一切看情况。
选项 1 当您不需要在其他任何地方使用您的列表时,这种情况是合适的。我的意思是,如果其他对象将此列表引用作为成员,则此对象也会修改此成员。
选项 2 这种情况看起来像情况 1,您可以将此方法用作情况 1,但在这里您 return 您的列表。它在第一种情况下带来了一些优势,您可以在 Stream API 或 Optionals:
链中使用您的方法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 ;
}
public List<A> myMethod() {
List<A> myList = null;
// possible initialization of list
// ...
// here we update list. In the case when list is null then we do not modify it
return Optional.ofNullable(myList).map(this::updateList).orElse(null);
}
选项 3 在这种情况下,您将数组复制到另一个数组中。在不应修改初始数组的情况下,它是有意义的,例如它是其他一些 class.
的字段最后你更喜欢哪个选项完全是个人意见。但是,有一些注意事项可能会帮助您做出决定:
第一个和第二个选项几乎是一样的。两者都对作为参数传入的 List
进行操作。列表的更新不会创建任何新内容。这将建议选项 1 作为选择的解决方案,因为只有签名(没有额外的文档)选项 2 可能表明返回的列表是一个新的 List
实例。
返回选项 2 和选项 3 中的 List
的好处是您可以对该列表执行进一步的操作,从而使其可变。
最后一个选项使用防御性副本来实际创建输入的新实例 List
并对该列表进行操作。虽然这样做是一种很好的做法,但它可能会产生一些副作用,这可能是不需要的。对于选项 2,不需要将返回的列表分配给任何东西,因为它是作为参数传入的同一实例。这不是选项3的情况。这里必须对结果进行赋值,否则就符合垃圾回收的条件。