简而言之,我的问题是:如果一个方法被多次调用,从内存消耗的角度来看,让它void并使用List作为参数是否更好?返回它的值?万一它真的节省了内存,这不是一种不好的做法,因为代码更难阅读吗?
让我举个例子来说明一下。假设我有一个 Car 类,每辆汽车都必须属于一个 brand。我有一个从品牌列表中返回所有汽车的方法,该方法使用 foreach 和一个从一个品牌中检索所有汽车的方法。像下面的代码:
private List<Car> getCarsByBrands(List<Brand> brands) {
List<Car> result = new Arraylist<>;
for(Brand brand : brands) {
result.add(getCarsBySingleBrand(brand))
}
return result;
}
private List<Car> getCarsBySingleBrand(Brand brand) {
List<Car> result = new Arraylist<>;
result.add(retrieveCarsByBrand(brand)) // retrieveCarsByBrand omitted
return result;
}
我的一位同事辩称,方法 getCarsBySingleBrand 应该重写为 void 并使用 List 作为参数,该列表将包含您可以在下面看到的所有汽车:
private List<Car> getCarsByBrands(List<Brand> brands) {
List<Car> result = new Arraylist<>;
for(Brand brand : brands) {
getCarsBySingleBrand(result, brand))
}
return result;
}
private void getCarsBySingleBrand(List<Car> cars, Brand brand) {
cars.add(retrieveCarsByBrand(brand)) // retrieveCarsByBrand omitted
}
他认为这种方式消耗的内存更少,因为每次调用方法 getCarsBySingleBrand 时他都不会创建一个列表。我认为这是一种不必要的优化,是一种不好的做法,因为代码更难理解。
最佳答案
第二个选项可能更优。
问题是第一种方法不仅必须为每个品牌创建另一个 List
对象,然后将其丢弃,但如果一个品牌有很多汽车,那么 Java 将调整大小列表(初始化为默认大小 16)多次。调整大小操作需要复制数组。如果您多次调整大小,这可能会变得昂贵。
第二个选项只有一个列表,因为调整大小通常会使容量翻倍,所以它应该比第一个选项调整大小的次数更少。
但是,这涉及到微优化。我不会担心这种事情,除非您注意到性能问题并进行分析以确定这是一个瓶颈。
如果您担心方法名称,我认为名称中包含“get”一词会使您失望,因为它通常意味着返回某些东西。将其命名为 addBrandOfCarsTo()
可能会使它读起来更像一个句子:
for(Brand brand : brands) {
addBrandOfCarsTo(result, brand));
}
关于java - 使用 list 参数作为返回值多次调用 void 方法比返回 List 的方法更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27951936/