java - 使用 list 参数作为返回值多次调用 void 方法比返回 List 的方法更好?

标签 java methods return-type

简而言之,我的问题是:如果一个方法被多次调用,从内存消耗的角度来看,让它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/

相关文章:

java - Spring MVC 路径模式匹配不处理破折号

java - 为什么 junit4 没有 Assert.assertArrayEquals() for double[]s?

java - 在 Java 中将资源文件夹目录从目标类更改为源

methods - 有没有一种方法可以使用后缀表示法来调用 Rust 中的函数而不需要定义新的特征?

java - 将数组值传递给单独的方法

c++ - 根据自定义 Iterator<T> 将返回值定义为 * 或 &

java - 使用 JApplet 连接到 SQL

c++ - 强制 SFINAE 使用不同的返回类型

c++ - 在 C 或 C++ 中返回结构是否安全?

ruby-on-rails - 用于元素引用和赋值的 Ruby 方法